1.迷宫一
#include<bits/stdc++.h>
using namespace std;
string mat[110];
int dir[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
bool vis[110][110];
int n,m;
bool in(int x,int y)
{
return x>=0&&x<n&&y>=0&&y<m;
}
int dfs(int x,int y)
{
if(mat[x][y]=='T')
{
return true;
}
vis[x][y]=1;
mat[x][y]='m';
for(int i=0;i<4;i++)
{
int dx=x+dir[i][0];
int dy=y+dir[i][1];
if(!vis[dx][dy]&&in(dx,dy)&&mat[dx][dy]!='*')
if(dfs(dx,dy))
{
return true;
}
}
vis[x][y]=0;
mat[x][y]='.';
return false;
}
int main()
{
cin>>n>>m;
int x,y;
for(int i=0;i<n;i++)
{
cin>>mat[i];
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++)
{
if(mat[i][j]=='S')
{
x=i;
y=j;
}
}
}
if(dfs(x,y))
{
cout<<"yes";
}
else
{
cout<<"no";
}
}
2.迷宫二
#include<bits/stdc++.h>
using namespace std;
string mat[110];
int minn=10000;
int dir[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
bool vis[110][110];
int n,m;
bool in(int x,int y)
{
return x>=0&&x<n&&y>=0&&y<m;
}
int dfs(int x,int y,int tep)
{
if(mat[x][y]=='T')
{
if(tep<minn)
{minn=tep;}
return true;
}
vis[x][y]=1;;
for(int i=0;i<4;i++)
{
int dx=x+dir[i][0];
int dy=y+dir[i][1];
if(!vis[dx][dy]&&in(dx,dy)&&mat[dx][dy]!='*')
dfs(dx,dy,tep+1);
}
vis[x][y]=0;
}
int main()
{
cin>>n>>m;
int x,y;
for(int i=0;i<n;i++)
{
cin>>mat[i];
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++)
{
if(mat[i][j]=='S')
{
x=i;
y=j;
}
}
}
dfs(x,y,0);
if(minn==10000)
{
cout<<"-1";
}
else
{cout<<minn<<endl;}
}
3.迷宫三
将外围的‘.’看做出口(递归结束边界)
include<bits/stdc++.h>
using namespace std;
string maze[110];
int n,m;
int minn=10000;
int dir[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
int vis[110][110];
bool in(int x,int y)
{
return x>=0&&x<n&&y>=0&&y<m;
}
int dfs(int x,int y,int tep)
{
if(maze[x][y]=='*')
{
if(tep<minn)
{
minn=tep;
}
return true;
}
vis[x][y]=1;
for(int i=0;i<4;i++)
{
int dx=x+dir[i][0];
int dy=y+dir[i][1];
if(!vis[dx][dy]&&in(dx,dy)&&maze[dx][dy]!='#')
{
dfs(dx,dy,tep+1);
}
}
vis[x][y]=0;
}
int main()
{
cin>>n>>m;int x,y;
for(int i=0;i<n;i++)
cin>>maze[i];
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(maze[i][j]=='@')
{
x=i;
y=j;
}
}
}
for(int i=0;i<n;i++)
{
if(maze[i][0]=='.')
maze[i][0]='*';
}
for(int i=0;i<n;i++)
{
if(maze[i][m-1]=='.')
maze[i][m-1]='*';
}
for(int i=0;i<m;i++)
{
if(maze[0][i]=='.')
maze[0][i]='*';
}
for(int i=0;i<m;i++)
{
if(maze[n-1][i]=='.')
maze[n-1][i]='*';
}
dfs(x,y,0);
cout<<minn<<endl;
}
总结迷宫类问题
找起点——>dfs——>找到终点,递归结束
string mat[110];//路径数组
int dir[4][2]={{-1,0},{0,-1},{1,0},{0,1}};//方向数组
bool vis[110][110];//判断走过每
bool in(int x,int y)//边界条件
{
return x>=0&&x<n&&y>=0&&y<m;
}
int dfs(int x,int y,int tep)
{
if(找到递归边界)
{
。。。。。
return true;//一定要有返回值
}
vis[x][y]=1;
for(int i=0;i<4;i++)
{
int dx=x+dir[i][0];
int dy=y+dir[i][1];
if(下一个方向是否满足条件)
dfs(dx,dy);
}
vis[x][y]=0;//回溯
}
4.爆炸
分析:就是先遍历找到是1的点,cnt++,然后让他boom(在给点所在的一整行和一整列中查找是否还有是一的点,再次递归boom),注意在另外开两个数组col和row,令他们为1,即代表他们也炸过了
#include<bits/stdc++.h>
using namespace std;
int n,m;
string maze[1100];
bool row[1010],col[1010];
int boom(int x,int y)
{
maze[x][y]=0;
if(!row[x])
{
row[x]=true;
for(int i=0;i<m;i++)
{
if(maze[x][i]=='1')
{
boom(x,i);
}
}
}
if(!col[y])
{
col[y]=true;
for(int i=0;i<n;i++)
{
if(maze[i][y]=='1')
{
boom(i,y);
}
}
}
}
int main()
{
int cnt=0;
cin>>n>>m;
for(int i=0;i<n;i++)
cin>>maze[i];
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(maze[i][j]=='1')
{
cnt=cnt+1;
boom(i,j);
}
}
}
cout<<cnt<<endl;
}
5、红与黑
注意这个不用回溯了,一搜到底
#include<iostream>
using namespace std;
int n,m;
int step=0;
char map[30][30]; //用来记录黑白瓷砖
bool visit[30][30]; //用来记录是否走过
int tr[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; //定义一个数组来表示每一个位置可以进行的尝试
bool in(int x,int y) //bool型变量判断是否还在规定区域内
{
return 0<=x&&x<n&&0<=y&&y<n;
}
void dfs(int x,int y)
{
step++; //用step表示可以走到的砖块数
visit[x][y]=1; //走过的地方记录在 visit中 防止重复
for(int i=0;i<4;i++) //每一个位置都尝试四种可能
{
int tx=x+tr[i][0];
int ty=y+tr[i][1];
if(!visit[tx][ty]&&map[tx][ty]=='.'&&in(tx,ty))
{
dfs(tx,ty);
}
}
}
int main()
{
cin>>m>>n; //m代表x方向(也就是列) n代表y方向(也就是行)
int x,y;
for(int i=0;i<n;i++) //输入n*m矩阵
for(int j=0;j<m;j++)
{
cin>>map[i][j];
if(map[i][j]=='@') //判断初始位置 并将其行和列位置赋给x,y记录
{
x=i;
y=j;
}
}
dfs(x,y); //深搜
cout<<step;
return 0;
}