有套路的的模板题(一条路走到黑,再换另一条路)
直接上例题,
九个方向上的深搜
#include<cstdio>
#include <iostream>
char a[110][110];
int m,n;
using namespace std;
void dfs(int x,int y)
{
if(x<0||x>m-1||y<0||y>n-1||a[x][y]=='.')//第一种方法
return ;
a[x][y]='.';
dfs(x-1, y-1);
dfs(x, y-1);
dfs(x+1, y-1);
dfs(x-1, y);
dfs(x+1, y);
dfs(x-1, y+1);
dfs(x, y+1);
dfs(x+1, y+1);
/*还可以这样
a[x][y]='.';
for(int i=-1;i<=1;i++)
{
for(int j=-1;j<=1;j++)
{
int nx=x+i;
int ny=y+j;
if(0<nx&&nx<m&&0<ny&&ny<n&&a[x][y]=='W')
dfs(nx,ny);
}
}*/
}
int main()
{
int i,j,ans=0;
scanf("%d%d",&m,&n);
for (i=0; i<m; i++)
{
for (j=0; j<n; j++)
{
cin>>a[i][j];//scanf("%c",&a[i][j]);
}
}
for (i=0; i<m; i++)
{
for(j=0;j<n;j++)
{
if(a[i][j]=='W')
ans++;//需要深搜一次就加1一次
dfs(i,j);
}
}
printf("%d\n",ans);
return 0;
}
四个方向上的深搜
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int m,n,flag;
char a[510][510];
int b[510][510];
int ax[4]={0,0,1,-1};
int ay[4]={1,-1,0,0};
int dfs(int i,int j)
{
b[i][j]=1; //标记是否访问过
for(int k=0;k<4;k++)//四个方向
{
int dx=i+ax[k];
int dy=j+ay[k];
if(a[dx][dy]=='t')
{
flag=1;
return 0;
}
else if(0<=dx&&dx<m&&0<=dy&&dy<n&&a[dx][dy]=='.'&&b[dx][dy]==0)//在有效范围内
{
b[dx][dy]=1;
dfs(dx,dy);
}
else
continue;
}
return 0;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int x=0,y=0;
flag=0;
memset(b,0,sizeof(b));
cin>>m>>n;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
cin>>a[i][j];
if(a[i][j]=='s')//从s开始t结束
{
x=i;
y=j;
}
}
}
dfs(x,y);
if(flag==1)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}