dfs求子连通图的变形,没什么难度,除了打错了个变量WA了很久,然后搞错了i++和++i。。。。。
细节决定成败啊~~~~~~~~
#include<cstdio>
#include<iostream>
#include<mem.h>
#include<memory.h>
#include<algorithm>
using namespace std;
const int maxn=550;
char G[maxn][maxn];//储存图~~
int vis[maxn][maxn];//访问标记,顺便储存次数
int m,n;
int dr[]={-1,0,+1,0};//向上,右,下,左,顺时针
int dc[]={0,+1,0,-1};
int types[11][4]={{1,0,0,1},//11种田顺时针(上,右,下,左)
{1,1,0,0},
{0,0,1,1},
{0,1,1,0},
{1,0,1,0},
{0,1,0,1},
{1,1,0,1},
{1,0,1,1},
{0,1,1,1},
{1,1,1,0},
{1,1,1,1}
};
void dfs(int r,int c,int cnt)
{
vis[r][c]=cnt;
for(int i=0;i<4;i++)
{
int nr=r+dr[i];
int nc=c+dc[i];
if(nr<0||nr>=m||nc<0||nc>=n) continue;
if(vis[nr][nc]) continue;
if(types[G[r][c]-'A'][i]&&types[G[nr][nc]-'A'][(i+2)%4])
{
dfs(nr,nc,cnt);
}
}
}
int main()
{
//freopen("1.txt","r",stdin);
while(scanf("%d%d",&m,&n)!=0)
{
if(m==-1&&n==-1) break;
for(int i=0;i<m;i++)
scanf("%s",G[i]);
memset(vis,0,maxn*maxn*sizeof(int));
int ans=0;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
if(!vis[i][j]) dfs(i,j,++ans);
}
printf("%d\n",ans);
}
return 0;
}