poj地址:http://poj.org/problem?id=1562
Description
Input
Output
Sample Input
1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
0 0
Sample Output
0
1
2
2
==============================天生骄傲的分割线==============================
描述:
给出一个N*M的矩形区域和每个区域的状态 – @有/*没有石油,(定义)如果两个有石油的区域是相邻的(水平、垂直、斜)则认为这是属于同一个油田。求这块矩形区域一共有多少油田
输入:
多组输入,每组输入包括两个整数n,m表示矩阵区域的列数和行数(1<=m,n<=100)和矩阵区域的状态,以
n=m=-1结束输入
这个题是一个简单的DFS,没什么好说的
<pre name="code" class="cpp">#include<iostream> #include<stdio.h> #include<memory.h> using namespace std; char map[101][101]; int result; int n,m; int move[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}}; //深度搜索 void dfs(int x,int y){ int a,b; map[x][y] = '*'; //访问过的都由@改为*,剪枝 for(int i=0;i<8;i++){ a=x+move[i][0]; b=y+move[i][1]; if(a>=0&&a<n&&b>=0&&b<m&&map[a][b]=='@'){ dfs(a,b); } } } int main(){ while(cin>>n>>m&&n||m){ int i,j; //初始化 result=0; for(i=0;i<n;i++){ cin>>map[i]; } for(i=0;i<n;i++){ for(j=0;j<m;j++){ if(map[i][j]=='@'){ dfs(i,j); result++; } } } //打印结果 printf("%d\n",result); } return 0; }
参考博客:http://blog.csdn.net/v5zsq/article/details/46591883
http://blog.csdn.net/keshacookie/article/details/22817433