Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
郁闷中,自己测了n多数据了...........#include <stdio.h> #include <string.h> int dor[100][2],dn; //每扇门所连的房间,门的数量 int key[100][26],kn[100]; //开每扇门所需的钥匙和钥匙数 bool rom[20],d[100],rk[27]; //已开的房间和已开的门,已获得的钥匙 int n,t; //房间数,起始房间 int kir[20][26],km[20]; //每个房间内的钥匙和钥匙数 char a[11]; //临时字符串 void iit() { dn=-1; memset(kn,0,sizeof(kn)); memset(rom,0,sizeof(rom)); memset(d,0,sizeof(d)); memset(rk,0,sizeof(rk)); memset(km,0,sizeof(km)); } void rdd() { scanf("%d%d",&t,&n);//getchar(); char cc='a'; while(cc!='\n') scanf("%c",&cc); rom[t]=true; for(int i=0;i<n;i++) { char k; int j=0; bool tag=false; //表示是否在数字串内 while(true) { scanf("%c",&k); if(k>='0'&&k<='9') { if(!tag) {j=k-'0';dn++;} else j=j*10+(k-'0'); tag=true; } else { if(k>='A'&&k<='Z'||tag) { dor[dn][0]=i; dor[dn][1]=j; if(k>='A'&&k<='Z') { k-='A'; key[dn][kn[dn]++]=k; } else key[dn][kn[dn]++]=26; } tag=false; if(k=='\n') break; } } } dn++; for(int i=0;i<n;i++) while(true) { char c; scanf("%c",&c); if(c=='\n') break; else if(c>='A'&&c<='Z') kir[i][km[i]++]=c-'A'; } for(int j=0;j<km[t];j++) rk[kir[t][j]]=true; rk[26]=true; } void sol() { if(t==0) {printf("YES\n");return;} int i,j,k,tt; for(i=0;i<dn;i++) if(!d[i]) { int u=dor[i][0],v=dor[i][1]; if(rom[u]&&!rom[v]||!rom[u]&&rom[v]) { for(j=0;j<kn[i]&&rk[key[i][j]];j++); if(j==kn[i]) { tt=rom[u]?v:u; if(tt==0) {printf("YES\n");return;} d[i]=true; rom[tt]=true; for(k=0;k<km[tt];k++) rk[kir[tt][k]]=true; i=-1; } } } printf("NO\n"); } int main() { while(true) { scanf("%s",a); if(strlen(a)==10) break; iit(); rdd(); sol(); scanf("%s",a); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator