poj 1013 Counterfeit Dollar(模拟)
恩,以前做过的一个智力题,本以为可以很简单解决,没想到却拖了好几天也没解决,总的来说是没理清思路,没想好怎么保存已经确定的状态,最后才考了一下网上代码才解决,其实开两个数组就行了,只是当时没想到,总是想着能少开个数组就少开个,节约空间,但是这样会浪费时间,其实结果是一样。
代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> int w[20];//存储现态; int f[20];//存储上一个状态 int main() { int len,cas,i,j; char left[20],right[20],res[10]; scanf("%d",&cas); getchar(); while(cas--) { memset(w,-1,sizeof(w)); for(j=1;j<=3;j++) { scanf("%s%s%s",left,right,res); getchar(); len=strlen(left); memset(f,0,sizeof(f)); if (strcmp(res,"even")==0)//两边相等时,每一个硬币都是真的。 { for(i=0;i<len;i++) w[left[i]-'A']=w[right[i]-'A']=0; } else if(strcmp(res,"up")==0)//up时,左边重右边轻 { memcpy(f,w,sizeof(w)); memset(w,0,sizeof(w)); for(i=0;i<len;i++) { w[left[i]-'A']=2; w[right[i]-'A']=1; } for(i=0;i<16;i++) if(f[i]>=0 && w[i] != f[i]) w[i]=0; } else//down时左边轻右边重 { memcpy(f,w,sizeof(w)); memset(w,0,sizeof(w)); for(i=0;i<len;i++) { w[left[i]-'A']=1; w[right[i]-'A']=2; } for(i=0;i<16;i++) if(f[i]>=0 && w[i] != f[i]) w[i]=0; } } for(i=0;i<16;i++) if(w[i]>0) printf("%c is the counterfeit coin and it is %s.\n",i+'A',w[i]==1?"light":"heavy"); } return 0; }