经典的DFS。
八连块问题,UVa上做过原题。
注意下有关字符串的输入问题,scanf(“%s”,s)不会读入换行。
#include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int N,M; char grid[105][105]; bool vis[105][105]; void dfs(int i,int j) { if(vis[i][j]) return; if(grid[i][j]!='@') return; if(!(1<=i&&i<=N&&1<=j&&j<=M)) return; vis[i][j]=true; dfs(i-1,j-1); dfs(i-1,j); dfs(i-1,j+1); dfs(i,j-1); dfs(i,j+1); dfs(i+1,j-1); dfs(i+1,j); dfs(i+1,j+1); } int main() { while(scanf("%d",&N)&&N) { scanf("%d",&M); memset(grid,0,sizeof(grid)); memset(vis,0,sizeof(vis)); for(int i=1; i<=N; ++i) scanf("%s",grid[i]+1); int ans=0; for(int i=1; i<=N; ++i) for(int j=1; j<=M; ++j) if(grid[i][j]=='@'&&!vis[i][j]) { ans++; dfs(i,j); } printf("%d\n",ans); } return 0; }