算法竞赛入门经典 例题 6-12 油田(Oil Deposits, UVa 572)

来源:互联网 发布:古典气质知乎 编辑:程序博客网 时间:2024/05/21 17:25

输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块。如果两个字符“@”所在的格子相邻(横、竖或者对角线方向),就说它们属于同一个八连块。

Sample Input

1 1 

3 5 
*@*@* 
**@** 
*@*@* 
1 8 
@@****@* 
5 5 
****@ 
*@@*@ 
*@**@ 
@@@*@ 
@@**@ 
0 0

Sample Output




2

#include<iostream>#include<cstdio>#include<cstring>using namespace std;/*Input Sample:5 5****@*@@*@*@**@@@@*@@@**@Output Sample:2*/char s[20][20];//二维图形bool vis[20][20];//是否访问int movx[8]= {0,0,1,1,1,-1,-1,-1}; //横坐标移动方案int movy[8]= {1,-1,0,1,-1,0,1,-1}; //对应纵坐标的移动方案int sum,m,n;//sum:八连块的区域数,m:行数 n:列数//深搜过程void dfs(int x,int y){    int xx,yy,i;    for(i=0; i<8; i++)    {        xx=x+movx[i];        yy=y+movy[i];        if(xx>=1 && xx<=m && yy>=1 && yy<=n) //不越界        {            if(s[xx][yy]=='@' && vis[xx][yy]==false) //该位置是@并且没有被访问过            {                vis[xx][yy]=true;                dfs(xx,yy);            }        }    }}int main(){    int i,j;    while(cin>>m>>n)//m:行 n:列    {        if(m==0 || n==0)            break;        sum=0;//每次需要重新清零        memset(vis,false,sizeof(vis));//每次需要重新置为false        //输入二维图形        for(i=1; i<=m; i++)        {            for(j=1; j<=n; j++)            {                cin>>s[i][j];            }        }        //遍历图形        for(i=1; i<=m; i++)        {            for(j=1; j<=n; j++)            {                if(s[i][j]=='@' && vis[i][j]==false)                {                    vis[i][j]=true;                    sum++;                    dfs(i,j);                }            }        }        cout<<sum<<endl;    }    return 0;}


0 0
原创粉丝点击