本文主要是介绍CCPC绵阳 7-7 Game of Cards(打表找规律),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题意:
数字0,1,2,3各有一些数目,每次可以取两个数字和小于等于3,然后替换成其和。
不能选数的人输了。求先手是否必胜。
思路:
用dfs(因为不会SG)打了个表然后找规律,发现和c3的数目没有关系,然后只需要判断c0和c1的关系。
唯一需要特判的是c1 c2 c3都是0的情况。
#define MYDEBUG#include <algorithm>
#include <iostream>
#include <cstdio>
#include <bitset>
#include <string>
#include <cstring>
#include <ctime>
#include <stack>
#include <vector>
#include <cmath>
#include <queue>
#include <set>
#include <map>
#include <list>using namespace std;bool check(int c0,int c1,int c2,int c3) {if(c1 % 3 == 2) {return true;} else if(c1 % 3 == 0) {if(c0 % 2 == 0) return false;else return true;} else if(c1 % 3 == 1) {if(c0 % 2 == 0) return true;else return false;}return false;
}int vis[40][40][40][40]; //bool dfs(int c0,int c1,int c2,int c3) { //打表代码if(vis[c0][c1][c2][c3] != -1) return vis[c0][c1][c2][c3];if(c0 + c1 + c2 + c3 <= 1) return false;bool flag = false;//c0 + c1if(c0 >= 1 && c1 >= 1 && !dfs(c0 - 1,c1,c2,c3)) flag = true;//c0 + c2if(c0 >= 1 && c2 >= 1 && !dfs(c0 - 1,c1,c2,c3)) flag = true;//c0 + c3if(c0 >= 1 && c3 >= 1 && !dfs(c0 - 1,c1,c2,c3)) flag = true;//c1 + c2if(c1 >= 1 && c2 >= 1 && !dfs(c0,c1 - 1,c2 - 1,c3 + 1)) flag = true;//c0 + c0if(c0 >= 2 && !dfs(c0 - 1,c1,c2,c3)) flag = true;//c1 + c1if(c1 >= 2 && !dfs(c0,c1 - 2,c2 + 1,c3)) flag = true;return vis[c0][c1][c2][c3] = flag;
}int main() {int kase = 0;int T;scanf("%d",&T);srand(time(NULL));while(T--) {int c0,c1,c2,c3;scanf("%d%d%d%d",&c0,&c1,&c2,&c3);printf("Case #%d: ",++kase);bool flag = false;if(c0 == 0 && c1 == 0 && c2 == 0 && c3 == 0) {flag = false;} else if(c1 == 0 && c2 == 0 && c3 == 0) {if(c0 % 2 == 1) {flag = false;} else {flag = true;}} else {if(c2 < c1 % 3) {flag = check(c0,c1 - 1,c2,c3);} else {flag = check(c0,c1,c2,c3);}}if(flag) printf("Rabbit\n");else printf("Horse\n");}return 0;
}
这篇关于CCPC绵阳 7-7 Game of Cards(打表找规律)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!