题意:给两个整数n、m,接下来输入m行n列的一张图,如果m==0停止输入,否则 1 <= m <= 100 and 1 <= n <= 100,八方向联通,求‘@’组成的不联通的块数。
样例:
这应该是学dfs的模版题,挑战程序设计竞赛上有类似的题目,这道题稍微有点不同的就是是八方向联通而已,算法的思想还是一模一样,找到一个‘@’,然后开始按八方向递归搜索,将搜到的‘@’都改为‘*’,直到最后所有的都变为了‘*’,搜索也就结束了。
#include<iostream> #include<math.h> #include<algorithm> #include<stdio.h> #include<string.h> #include<string> #define ll long long #define MAX_N 105 using namespace std; int n,m; char pi[MAX_N][MAX_N]; int dir[8][2] = {{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}}; //八方向 int ans; bool judge(int x,int y) { if(x<1 || x>m || y<1 || y>n) return false; return true; } void dfs(int x,int y) { for(int i = 0; i < 8; i++) { int xx = x+dir[i][0]; int yy = y+dir[i][1]; if(judge(xx,yy) && pi[xx][yy]=='@') { pi[xx][yy] = '*'; //将搜到的‘@’改为‘*’ dfs(xx,yy); } } } void solve() { ans = 0; for(int i = 1; i <= m; i++) { for(int j = 1; j <= n; j++) { if(pi[i][j]=='@') { pi[i][j] = '*'; dfs(i,j); ans++; } } } } int main() { while(cin>>m>>n,m) { for(int i = 1; i <= m; i++) { for(int j = 1; j <= n; j++) { cin>>pi[i][j]; } } solve(); cout<<ans<<endl; } return 0; }