ZOJ 2412 Farm Irrigation

来源:互联网 发布:工资查询软件 编辑:程序博客网 时间:2024/06/16 07:46

转载请注明出处:http://blog.csdn.net/a1dark

分析:蛋蛋疼、跟上一题一样、图的DFS遍历、不过这里需要预处理一下字符、然后再DFS、

#include<stdio.h>#include<string.h>#include<iostream>using namespace std;char mp[55][55];int used[55][55];int N,m,sum;struct node{    int up,down,left,right;};node n[11]={{1,0,1,0},{1,0,0,1},{0,1,1,0},{0,1,0,1},{1,1,0,0},{0,0,1,1},{1,0,1,1},{1,1,1,0},{0,1,1,1},{1,1,0,1},{1,1,1,1}};    //保存农田形状int getnode(char x){    return x-'A';}int cango(int x,int y){    if(x<=0||x>m||y<=0||y>N)        return 0;    return 1;}void dfs(int x,int y){    int i,j,k,xx,yy;   for(i=0;i<4;i++){       if(i==0){   //上走           xx=x-1;           yy=y;           if(cango(xx,yy)&&!used[xx][yy]&&n[getnode(mp[xx][yy])].down&&n[getnode(mp[x][y])].up){               used[xx][yy]=1;               dfs(xx,yy);           }        }       else if(i==1){           xx=x+1;           yy=y;        if(cango(xx,yy)&&!used[xx][yy]&&n[getnode(mp[xx][yy])].up&&n[getnode(mp[x][y])].down){               used[xx][yy]=1;               dfs(xx,yy);           }       }      else if(i==2){           xx=x;           yy=y-1;        if(cango(xx,yy)&&!used[xx][yy]&&n[getnode(mp[xx][yy])].right&&n[getnode(mp[x][y])].left){               used[xx][yy]=1;               dfs(xx,yy);           }       }     else if(i==3){           xx=x;           yy=y+1;        if(cango(xx,yy)&&!used[xx][yy]&&n[getnode(mp[xx][yy])].left&&n[getnode(mp[x][y])].right){               used[xx][yy]=1;               dfs(xx,yy);           }       }   }}int main(){    int i,j,k;    while(scanf("%d%d",&m,&N)&&N!=-1&&m!=-1){        sum=0;        memset(used,0,sizeof(used));        for(i=1;i<=m;i++)          for(j=1;j<=N;j++){              scanf("%1s",&mp[i][j]);          }       for(i=1;i<=m;i++)            for(j=1;j<=N;j++){                if(used[i][j]==0){                    sum++;                    dfs(i,j);                }           }       cout<<sum<<endl;    }    return 0;}


原创粉丝点击