其实深搜的题做多了就会发现是很有套路的。
做这个遇到的问题就是不知道怎么计算出所有的连通块,想了半天才发现,只要找到一个@开始搜,只要和这个@能够连通的都会搜到,然后将这些搜过的变为 '*',表示搜过了,然后循环去找下一个 @.
这里一定注意:在判断 x, y 是否越界的时候,x是小于n还是m一定要搞清楚!!!检查了三遍才发现
上代码:
#include <iostream>
using namespace std;
char maps[102][102];
int m,n;
int sum;
int dx[8]={-1,1,0,0,-1,-1,1,1},dy[8]={0,0,-1,1,-1,1,-1,1};
bool judge(int x,int y)
{
if(x >=0 && y >=0 && x < m && y < n && maps[x][y]=='@')
return true;
return false;
}
void dfs(int x,int y)
{
int nx,ny;
for(int i=0; i < 8; i++)
{
nx = x+dx[i],ny = y + dy[i];
if(judge(nx,ny))
{
maps[nx][ny]='*';
dfs(nx,ny);
}
}
}
int main()
{
while(cin>>m>>n)
{