心如止水
Je n'ai pas le temps
posts - 400,comments - 130,trackbacks - 0
题目大意:给出水管的分布,求出需要多少个水源。即求出无向图有多少个连通分量。
DFS遍历一次即可。
以下是我的代码:
#include<cstdio>
#include
<cstring>
using namespace std;
const int kMaxn(57);
const int kWater[]={6,10,20,24,18,12,14,22,28,26,30};
const int dx[]={0,0,1,-1},dy[]={1,-1,0,0};

int m,n;
char g[kMaxn][kMaxn];
bool used[kMaxn][kMaxn];

void dfs(int x,int y)
{
    used[x][y]
=true;
    
for(int i=0;i<4;i++)
    {
        
int xx(x+dx[i]),yy(y+dy[i]);
        
if(xx<1 || xx>|| yy<1 || yy>|| used[xx][yy])
            
continue;

        
int t1(g[x][y]-'A'),t2(g[xx][yy]-'A');
        
if(i==0 && (kWater[t1]&(1<<3)) && (kWater[t2]&(1<<2)))
            dfs(xx,yy);
        
else if(i==1 && (kWater[t1]&(1<<2)) && (kWater[t2]&(1<<3)))
            dfs(xx,yy);
        
else if(i==2 && (kWater[t1]&(1<<4)) && (kWater[t2]&(1<<1)))
            dfs(xx,yy);
        
else if(i==3 && (kWater[t1]&(1<<1)) && (kWater[t2]&(1<<4)))
            dfs(xx,yy);
    }
}

int main()
{
    
/*
    freopen("data.in","r",stdin);
    freopen("data.out","w",stdout);
    //
*/

    
while(scanf("%d%d",&m,&n)==2 && m>=0 && n>=0)
    {
        
for(int i=1;i<=m;i++)
        {
            getchar();
            
for(int j=1;j<=n;j++)
                scanf(
"%c",&g[i][j]);
        }

        
int ans(0);
        memset(used,
false,kMaxn*kMaxn*sizeof(bool));
        
for(int i=1;i<=m;i++)
            
for(int j=1;j<=n;j++)
                
if(!used[i][j])
                {
                    ans
++;
                    dfs(i,j);
                }

        printf(
"%d\n",ans);
    }

    
return 0;
}
posted on 2011-05-26 15:38 lee1r 阅读(194) 评论(0)  编辑 收藏 引用 所属分类: 题目分类:图论

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理