UVA572dfs连通块

来源:互联网 发布:高尔夫规则软件 编辑:程序博客网 时间:2024/05/22 06:51

这题WA了一发,简单的连通块,手残了,输入的时候本来下标都是打算从一开始的,

然后还有gets输入,另外如果是从1开始的下标记得取余什么的n要加一,另外已经加入队列的记得

标记为1.

#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<string>#include<cctype>#include<cmath>#include<map>#include<set>#include<vector>#include<queue>#include<stack>#include<ctime>#include<algorithm>#include<sstream>#define LL long longusing namespace std;int vis[110][110];char grid[110][110];int n,m;int dx[8]={-1,0,0,1,-1,-1,1,1},dy[8]={0,-1,1,0,-1,1,-1,1};void dfs(int u){    queue<int> q;    q.push(u);    while(!q.empty())    {    //    cout<<"hehe"<<endl;        int d=q.front();        q.pop();        int x=d/(n+1);        int y=d%(n+1);      //  cout<<x<<' '<<y<<endl;        vis[x][y]=1;        for(int i=0;i<8;i++)        {            int e=x+dx[i];            int f=y+dy[i];      //      cout<<e<<' '<<f<<' '<<vis[e][f]<<' '<<grid[e][f]<<endl;         //   vis[e][f]=1;            if(e>0&&e<=m&&f>0&&f<=n&&!vis[e][f]&&grid[e][f]=='@')            {                q.push(e*(n+1)+f);         //       cout<<e<<' '<<f<<endl;                vis[e][f]=1;            }        }    }}int main(){    while(cin>>m)    {        cin>>n;        if(!m) break;        getchar();        for(int i=1;i<=m;i++)            for(int j=1;j<=n;j++)            {                cin>>grid[i][j];            }      //  for(int i=1;i<=m;i++)      //      for(int j=1;j<=n;j++)     //       cout<<grid[i][j];        int sum=0;        memset(vis,0,sizeof(vis));        for(int i=1;i<=m;i++)            for(int j=1;j<=n;j++)        {            if(!vis[i][j]&&grid[i][j]=='@')            {                sum++;                dfs(i*(n+1)+j);            }        }        cout<<sum<<endl;    }    return 0;}


0 0
原创粉丝点击