hdu 1198Farm Irrigation

来源:互联网 发布:淘宝首页html代码示例 编辑:程序博客网 时间:2024/04/23 15:08

水管游戏 本题题意是有11种水管  任意摆放 问建多少井能灌满所有管道

关键是水管的预处理 用深搜和并查集都行

我写的是深度搜索  并查集不太会

#include <iostream>#include <cstring>#include <cstdio>using namespace std;int n,m;char str[52][52];int flag[52][52];int a[][4]={    {1,1,0,0},{1,0,0,1},{0,1,1,0},{0,0,1,1},                    {1,0,1,0},{0,1,0,1},{1,1,0,1},{1,1,1,0},{0,1,1,1},                    {1,0,1,1},{1,1,1,1}};//预处理int b[][2]={-1,0,0,-1,1,0,0,1};int sum;void dfs(int x,int y){    flag[x][y]=1;    for(int i = 0; i < 4; i++)    {        if(a[str[x][y]-'A'][i])        {            int nx = x+b[i][0];            int ny = y+b[i][1];            if(nx < 0 || ny < 0 || nx >= m || ny >= n)                continue;            switch(i)            {            case 0:if(a[str[nx][ny]-'A'][2] && !flag[nx][ny])                    dfs(nx,ny);                break;            case 1:if(a[str[nx][ny]-'A'][3] && !flag[nx][ny])                    dfs(nx,ny);                break;            case 2:if(a[str[nx][ny]-'A'][0] && !flag[nx][ny])                    dfs(nx,ny);                break;            case 3:if(a[str[nx][ny]-'A'][1] && !flag[nx][ny])                    dfs(nx,ny);                break;            }//四个方向一次判断是否搜索        }    }}int main(){    while(~scanf("%d%d",&m,&n)&&m>0&&n>0){        memset(flag,0,sizeof(flag));        sum=0;        for(int i=0; i<m; i++)        scanf("%s",str[i]);        for(int i=0; i<m; i++)        for(int j=0; j<n; j++){            if(!flag[i][j]){                sum++;                dfs(i,j);            }        }        cout<<sum<<endl;    }    return 0;}

0 0