标签:
Description
Input
Output
Sample Input
1 1 * 3 5 *@*@* **@** *@*@* 1 8 @@****@* 5 5 ****@ *@@*@ *@**@ @@@*@ @@**@ 0 0
Sample Output
0 1 2 2
解题思路:
这个题目的大意是我们有许多的小分块,但是当这些小分块的水平连通,垂直连通或者是对角线连通时,这就是一个大的块。现在我们要求的就是这块油田有多少个分块。这是一个深度搜索的问题。当我们找到一个小块的时候,我们就将这个点的八个方向进行一次查找,当走过一个@后就把它标记为*,此时我们要用到递归的方法,再查找我们找到的@。
程序代码:
#include <iostream> using namespace std; #define N 111 char str[N][N]; int a,b; int next[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};//八个方向 void fun(int x,int y) { int m,n,k; for(k=0;k<8;k++) { n=x+next[k][0]; m=y+next[k][1]; if(n<0||n>a-1||m<0||m>b-1||str[n][m]==‘*‘) continue; str[n][m]=‘*‘;//标记 fun(n,m);//递归 } } int main() { int flag; while(cin>>a>>b&&(a||b)) { flag=0; for(int i=0;i<a;i++) for(int j=0;j<b;j++) cin>>str[i][j]; for(int x=0;x<a;x++) { for(int y=0;y<b;y++) { if(str[x][y]==‘@‘) { str[x][y]=‘*‘;//标记 fun(x,y); flag++;//累加连通的块数 } } } cout<<flag<<endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/xinxiangqing/p/4688441.html