因为这道题中给的数据比较小,所以可以直接用枚举的方式进行dfs搜索,每出现一个‘@’,就进行一次dfs的搜索,将所有相邻的‘@’全部变成‘*’。
#include"iostream" #include"stdio.h" #include"algorithm" #include"string.h" #include"cmath" #include"queue" #define mx 105 using namespace std; char map1[mx][mx]; int dir[8][2]={{0,1},{0,-1},{1,0},{-1,0}, {-1,-1},{-1,1},{1,1},{1,-1}}; int n,m,num; bool judge(int x,int y) { if(x>=0&&x<n&&y>=0&&y<m&&map1[x][y]==‘@‘)return true; return false; } void dfs(int x,int y) { int i,dx,dy; for(i=0;i<8;i++) { dx=x+dir[i][0]; dy=y+dir[i][1]; if(judge(dx,dy)) {map1[dx][dy]=‘*‘;dfs(dx,dy);} } } int main() { while(cin>>n>>m,n||m) { int i,j; num=0; for(i=0;i<n;i++) { for(j=0;j<m;j++) { cin>>map1[i][j]; } } for(i=0;i<n;i++) for(j=0;j<m;j++) { if(judge(i,j)) {num++;map1[i][j]=‘*‘;dfs(i,j);} } cout<<num<<endl; } return 0; }
时间: 2024-10-10 09:48:54