发布时间:2025-06-24 19:04:58 作者:北方职教升学中心 阅读量:766
代码
class Solution { bool row[9][10]; bool col[9][10]; bool grid[3][3][10];public: void solveSudoku(vector<vector<char>>& board) { for(int i=0;i<9;i++) for(int j=0;j<9;j++){ if(board[i][j]!='.'){ int num=board[i][j]-'0'; row[i][num]=col[j][num]=grid[i/3][j/3][num]=true; } } dfs(board); } bool dfs(vector<vector<char>>& board){ for(int i=0;i<9;i++) for(int j=0;j<9;j++){ if(board[i][j]=='.'){ //填数 for(int num=1;num<=9;num++){ if(!row[i][num] && !col[j][num] && !grid[i/3][j/3][num]){ board[i][j]=num+'0'; row[i][num]=col[j][num]=grid[i/3][j/3][num]=true; if(dfs(board)) return true; row[i][num]=col[j][num]=grid[i/3][j/3][num]=false; board[i][j]='.'; } } return false; } } return true; }};
单词搜索
题目
思路
解决这道题是使用DFS,先扫描原始二维矩阵中的每个位置,判断是否与字符串第一个位置的值相等,如果相等,则对该位置进行DFS,递归的出口是匹配完字符串的所有位置的字符。
代码
class Solution { bool vis[16][16]; int ret,m,n; int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0};public: int getMaximumGold(vector<vector<int>>& grid) { m=grid.size(),n=grid[0].size(); for(int i=0;i<m;i++) for(int j=0;j<n;j++){ if(grid[i][j]){ vis[i][j]=true; dfs(grid,i,j,grid[i][j]); vis[i][j]=false; } } return ret; } void dfs(vector<vector<int>>& grid,int i,int j,int sum){ ret=max(ret,sum); for(int k=0;k<4;k++){ int x=i+dx[k],y=j+dy[k]; if(x>=0 && x<m && y>=0 && y<n && !vis[x][y] && grid[x][y]){ vis[x][y]=true; dfs(grid,x,y,sum+grid[x][y]); vis[x][y]=false; } } }};
不同路径III
题目
思路
之前讲解过不同路径和不同路径II,都是使用动态规划来解决的,这道题之所以没有使用动态规划来解决是因为使用动态规划来解决这道题比较困难,下面将使用DFS来解决这道题。
那么该如何处理上面这3条规则那?和上一道题一样,使用一个数组row来记录每一行每个数字是否出现,使用一个数组col来记录每一列每个数字是否出现,使用一个数组grid来记录每个3x3的宫格内每个数字是否出现过,如果不满足上面的三个条件,说明不是数独;否则是数独。
首先扫描整个二维矩阵,计算出0的个数以及起始位置的坐标,然后从起始位置进行DFS,每走一步对步数进行++,直到步数等于原始二维矩阵0的个数+2(起始位置和结束位置),因为不能走已经走过的位置,因此需要使用一个二维矩阵来标记已经走过的位置。
代码
class Solution { bool vis[21][21]; int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0}; int m,n,ret,sum;public: int uniquePathsIII(vector<vector<int>>& grid) { m=grid.size(),n=grid[0].size(); int bx,by; for(int i=0;i<m;i++) for(int j=0;j<n;j++) if(grid[i][j]==1) bx=i,by=j; else if(grid[i][j]==0) sum++; sum+=2; vis[bx][by]=true; dfs(grid,bx,by,1); return ret; } void dfs(vector<vector<int>>& grid,int i,int j,int val){ if(grid[i][j]==2){ if(val==sum) ret++; return; } for(int k=0;k<4;k++){ int x=i+dx[k],y=j+dy[k]; if(x>=0 && x<m && y>=0 && y<n && !vis[x][y] && grid[x][y]!=-1){ vis[x][y]=true; dfs(grid,x,y,val+1); vis[x][y]=false; } } }};