前前后后写了还几遍了,本来想着今天用BFS写,结果不知道怎么用BFS回溯,然后就用DFS写了,结果应该书数组爆了,不知道怎么回事
之后又改了几遍
#include <iostream> using namespace std; int m,n; int k[8][2]={{1,0},{1,1},{1,-1},{-1,0},{-1,1},{-1,-1},{0,1},{0,-1}}; char a[105][105]; void dfs(int x,int y) { a[x][y]='*'; for(int i=0;i<8;i++) { if(a[x+k[i][0]][y+k[i][1]]=='@' && x+k[i][0]>=0 && x+k[i][0]<m && y+k[i][1]>=0 && y+k[i][1]<n) dfs(x+k[i][0],y+k[i][1]); } } int main() { while(cin>>m>>n) { if(m==0 && n==0) break; int ans=0; for(int i=0;i<m;i++) { for(int j=0;j<n;j++) cin>>a[i][j]; } for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { if(a[i][j]=='@') { dfs(i,j); ans++; } } } cout<<ans<<endl; } return 0; }
BFS实现
#include <iostream> #include <queue> using namespace std; int m,n; int t[8][2]={{1,0},{1,1},{1,-1},{-1,0},{-1,1},{-1,-1},{0,1},{0,-1}}; char a[105][105]; queue<int> q; void bfs(int x,int y) { q.push(x); q.push(y); while(!q.empty()) { int k=q.front(); q.pop(); int l=q.front(); q.pop(); for(int i=0;i<8;i++) { if(a[k+t[i][0]][l+t[i][1]]=='@' && k+t[i][0]>=0 && k+t[i][0]<m && l+t[i][1]>=0 && l+t[i][1]<n) { a[k+t[i][0]][l+t[i][1]]='*'; q.push(k+t[i][0]); q.push(l+t[i][1]); } } } } int main() { while(cin>>m>>n) { if(m==0 && n==0) break; int ans=0; for(int i=0;i<m;i++) { for(int j=0;j<n;j++) cin>>a[i][j]; } for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { if(a[i][j]=='@') { bfs(i,j); ans++; } } } cout<<ans<<endl; } return 0; }