普通视图

发现新文章,点击刷新页面。
今天 — 2026年4月27日首页

建图+dfs 40 行左右

2020年3月22日 12:38

把每个格子转化成3*3的格子,有道路的地方写上1,之后dfs即可

class Solution {
    int map[1000][1000];
    void fill(int i, int j, int s)
    {
        map[i+1][j+1]=1;
        if(s==1) map[i+1][j]=map[i+1][j+2]=1;
        if(s==2) map[i][j+1]=map[i+2][j+1]=1;
        if(s==3) map[i+1][j]=map[i+2][j+1]=1;
        if(s==4) map[i+1][j+2]=map[i+2][j+1]=1;
        if(s==5) map[i+1][j]=map[i][j+1]=1;
        if(s==6) map[i+1][j+2]=map[i][j+1]=1;
    }
    int dir[4][2] = {0,1,1,0,-1,0,0,-1};
    void dfs(int x, int y)
    {
        map[x][y]=0;
        for(int i=0;i<4;i++)
        {
            int xx = x+dir[i][0];
            int yy = y+dir[i][1];
            if(map[xx][yy]==0)continue;
            dfs(xx, yy);
        }
    }
public:
    bool hasValidPath(vector<vector<int>>& grid) {
        memset(map,0,sizeof map);
        int n = grid.size();
        int m = grid[0].size();
        for(int i=1;i<=3*n;i+=3)
            for(int j=1;j<=3*m;j+=3)
                fill(i,j,grid[i/3][j/3]);
        dfs(2,2);
        return map[3*n-1][3*m-1]==0;
    }
};

顺便推荐一道很类似的题,Maze Connect,http://serjudging.vanb.org/wp-content/uploads/Maze-Connect.pdf
不过这样写可能不是最快的,我花了15分钟。。几乎是剩下三道题时间之和。。

后来想到map部分的函数也可以压缩,这样写比赛的时候可能会更省时间,代码也更短:

class Solution {
    int map[1000][1000];
    int o[6][4]={1,0,1,2,0,1,2,1,1,0,2,1,1,2,2,1,1,0,0,1,1,2,0,1};
    void fill(int i, int j, int s)
    {
        map[i+1][j+1]= map[i+o[s][0]][j+o[s][1]] = map[i+o[s][2]][j+o[s][3]]=1;
    }
    int dir[4][2] = {0,1,1,0,-1,0,0,-1};
    void dfs(int x, int y)
    {
        map[x][y]=0;
        for(int i=0;i<4;i++)
        {
            int xx = x+dir[i][0];
            int yy = y+dir[i][1];
            if(map[xx][yy]==0)continue;
            dfs(xx, yy);
        }
    }
public:
    bool hasValidPath(vector<vector<int>>& grid) {
        memset(map,0,sizeof map);
        int n = grid.size();
        int m = grid[0].size();
        for(int i=1;i<=3*n;i+=3)
            for(int j=1;j<=3*m;j+=3)
                fill(i,j,grid[i/3][j/3]-1);
        dfs(2,2);
        return map[3*n-1][3*m-1]==0;
    }
};
❌
❌