/*
25/10/13 20:40
题意:给出各种水管的形状,然后给出一大片水管(不超过50*50) ,问最少需要多少水源,能使所有水管中都有水,就类似于连通图一样的东西。。。
思路:dfs。从任意一个位置开始,顺蔓摸瓜标记就行了,被标记的点不能作为新的起始点,有多少个起始点,就有多少水源
重点:方向的定义一定要统一并且明确!!!例如我的定义:0123=上右下左
*/
#include<stdio.h>
#include<string.h>
int pipe[11][4]={{1,0,0,1},{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}};
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1},vis[55][55];
char map[55][55];
int M,N;
void dfs(int x,int y);
int main(){
int i,xx,yy,count;
while(scanf("%d%d",&M,&N),M+N!=-2)
{
count=0;
memset(vis,0,sizeof(vis));
for(i=0;i<M;i++)
scanf("%s",map[i]);
for(i=0;i<N*M;i++){
xx=i/N;
yy=i%N;
if(vis[xx][yy]==0){
dfs(xx,yy);
count++;
}
}
printf("%d\n",count);
}
return 0;
}
void dfs(int x,int y){
int i,xx,yy;
vis[x][y]=1;
for(i=0;i<4;i++){
xx=x+dx[i];
yy=y+dy[i];
if(vis[xx][yy]==1||xx>=M||xx<0||yy>=N||yy<0)continue;
if(pipe[ map[x][y]-'A' ][i]+pipe[ map[xx][yy]-'A' ][(i+2)%4]==2) //这里用(i+2)%4实现反方向
dfs(xx,yy);
}
}
ZOJ Problem Set - 2412解题报告
最新推荐文章于 2018-03-28 20:55:12 发布