http://acm.hdu.edu.cn/showproblem.php?pid=4155
题目大意:
1,2,3,4,5,6 大小的牌 各有4张
已经选了一些 可能继续选,可能不继续
问谁会赢
思路:
无论该谁选 他的所有可供选择的牌中 只要有一张牌使他胜利(使对方输) 他就会胜利 否则就会输
注意:
输入用scanf();
代码及其注释:
#include<iostream> #include<cstring> #include<stack> #include<cstdio> #include<math.h> #include<algorithm> #include<queue> using namespace std; int sum[8]; char s[26]; int K; bool dfsb(int ); bool dfsa(int num) { for(int i=6;i>=1;--i)//这里i从6 开始搜是因为 从大数开始搜可以减短搜的层数 总体上提高效率 { if(sum[i]>0&&num+i<=K)//i 可选择 { --sum[i]; if(dfsb(num+i)==false)//有一个选择使得B输 A就会胜利 {++sum[i];return true;} ++sum[i]; } } return false; } bool dfsb(int num) { for(int i=6;i>=1;--i) { if(sum[i]>0&&num+i<=K) { --sum[i]; if(dfsa(num+i)==false) {++sum[i];return true;} ++sum[i]; } } return false; } int main() { while(scanf("%s",s)!=EOF) { for(int i=1;i<=6;++i) { sum[i]=4;//每张牌有四张 } int n=strlen(s); K=31; int k=0; for(int i=0;i<n;++i) { --sum[s[i]-'0'];//减去已出现的牌 k=k+(s[i]-'0');//几经达到的大小 } bool awin;//A是否胜利 if(k>31)//如果几经大于31 { if(n%2==0)//n为偶数说明该A选了 所以是B超出了31 A胜利 awin=true; else awin=false; } else { if(n%2==0)//n 为偶数则从A开始选择 { if(dfsa(k)) awin=true; else awin=false; } else { if(dfsb(k)) awin=false; else awin=true; } } if(awin) { printf("%s A\n",s); } else { printf("%s B\n",s); } } return 0; }