思路一:dfs暴力搜索
从我做起振兴中华分别为12345678
1 | 2 | 3 | 4 | 5 |
2 | 3 | 4 | 5 | 6 |
3 | 4 | 5 | 6 | 7 |
4 | 5 | 6 | 7 | 8 |
迷宫问题模板
dfs(x,y,path) //从(x,y)深度优先搜索
if((x,y为终点坐标))
①x,y加入路径
②输出路径
③路径中去除(x,y)
剪枝函数:如果x,y越界,return
//(x,y)不是终点
●for(循环):(注意for循环写在外面)
①(x,y)加入路径
②如果邻接情况位被访问,访问(x,y)的邻接情况
dfs(x+方向矢量,y+方向矢量)
③路径中去除(x,y)
mat[x][y]={}//迷宫数组(0,0)开始
vis[x][y]={{0}...}//vis数组防止重复经过
void dfs(x,y,path) { if(x==endx&&y==endy) { vis[x][y]=1 path.push_back({x,y}); cout<
matx||y>maty)return;//防止越界 //方向1 path.push_back({x,y}); if(x+1<=matx&&vis[x+1][y]==0&&能够访问) { vis[x+1][y]=1; dfs(x+1,y,path); vis[x+1][y]=0; //其他方向类似 } }
#include
using namespace std;
int mat[4][5]={{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7},{4,5,6,7,8}};
int cnt=0;
int vis[4][5]={{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}};
int dic[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
void dfs(int x,int y,vector>path)
{
if(x==3&&y==4)
{
path.push_back({x,y});
vis[x][y]=1;
cnt++;
path.pop_back();
vis[x][y]=0;
return;
}
if(x<0||x>4||y<0||y>5)
return;
path.push_back({x,y});
if(x+1<=3&&vis[x+1][y]==0&&mat[x+1][y]-mat[path[path.size()-1][0]][path[path.size()-1][1]]==1)
{
vis[x+1][y]=1;
dfs(x+1,y,path);
vis[x+1][y]=0;
}
path.pop_back();
path.push_back({x,y});
if(x-1>=0&&vis[x-1][y]==0&&mat[x-1][y]-mat[path[path.size()-1][0]][path[path.size()-1][1]]==1)
{
vis[x-1][y]=1;
dfs(x-1,y,path);
vis[x-1][y]=0;
}
path.pop_back();
path.push_back({x,y});
if(y+1<=4&&vis[x][y+1]==0&&mat[x][y+1]-mat[path[path.size()-1][0]][path[path.size()-1][1]]==1)
{
vis[x][y+1]=1;
dfs(x,y+1,path);
vis[x][y+1]=0;
}
path.pop_back();
path.push_back({x,y});
if(vis[x][y-1]==0&&y-1>=0&&mat[x][y-1]-mat[path[path.size()-1][0]][path[path.size()-1][1]]==1)
{
vis[x][y-1]=1;
dfs(x,y-1,path);
vis[x][y-1]=0;
}
path.pop_back();
}
int main()
{
vector>path;
dfs(0,0,path);
cout<
第二种方法:递归
思路:经过观察,只要一直向右走或者向下走到达终点,就是一种情况
算法题的5种解法:
本题思路
#include
using namespace std;
//如果只有1行只能向右走,有一种走法
//f(x,y)为从(1,1)走到(x,y)有多少种走
//f(x,y)是从f(x,y-1)或f(x-1,y)走过来的
//递归方程:f(x,y)=f(x,y-1)+f(x-1,y)
int f(int x,int y)
{
if(x==1||y==1)
{
return 1;
}
return f(x,y-1)+f(x-1,y);
}
int main()
{
cout<
本题和leetcode62题思路一样
Leetcode62. 不同路径_m0_52043808的博客-CSDN博客