poj 2585

来源:互联网 发布:linux ansi 绿色 编辑:程序博客网 时间:2024/06/14 22:45

构图 然后toposort就OK了

#include<stdio.h>#include<string.h>#include<iostream>#include<string>#include<queue>using namespace std;int sx[10]={0,1,1,1,2,2,2,3,3,3};int sy[10]={0,1,2,3,1,2,3,1,2,3};int my[4]={0,0,1,1};int mx[4]={0,1,0,1};int judge[15][15];int sum[15];int a[10][10];int toposort(){    //printf("yes\n");    int cnt;    queue<int> q;    for(int i=1;i<=9;i++){        if(sum[i]==0) q.push(i);    }    cnt=0;    while(!q.empty()){        //printf("yes\n");        int t=q.front();        q.pop();        cnt++;        for(int i=1;i<=9;i++){            if(judge[t][i]==1) {                sum[i]--;                //judge[t][i]=0;                if(sum[i]==0) q.push(i);            }        }    }    if(cnt==9) return 1;    else        return 0;}int main(){    string d="ENDOFINPUT";    string s;    cin>>s;    while(s!=d){        memset(judge,0,sizeof(judge));        memset(sum,0,sizeof(sum));        //printf("yes\n");         for(int i=1;i<=4;i++){            for(int j=1;j<=4;j++){                scanf("%d",&a[i][j]);                }            }            cin>>s;        //printf("yes");       /* for(int i=1;i<=4;i++){  for(int j=1;j<=4;j++)  {  printf("%d",a[i][j]);            }            printf("\n");  }*/        for(int i=1;i<=9;i++){            int ssx=sx[i];            int ssy=sy[i];            for(int j=0;j<4;j++){                int nx=ssx+mx[j];                int ny=ssy+my[j];                if(a[nx][ny]!=i&&judge[a[nx][ny]][i]==0){                    judge[a[nx][ny]][i]=1;                    sum[i]++;                }            }        }        //for(int i=1;i<=9;i++) printf("%d\n",sum[i]);        //printf("yes");        int yes=toposort();        if(yes==1){            printf("THESE WINDOWS ARE CLEAN\n");        }        else if(yes==0){            printf("THESE WINDOWS ARE BROKEN\n");        }        cin>>s;    }    return 0;}


0 0
原创粉丝点击