HDU 2147 kiki's game Bash Game 巴什博弈 &&HDU 1846
http://acm.hdu.edu.cn/showproblem.php?pid=2147
n*m的方格,起点在最右上方,要走到左下方,每一步可以向下 ,左右,或左下走
第一道博弈,还以为套数数的那个公式呢(1~23) (N+M-2)%3==0则输掉比赛,原来那只是一个题的公式啊。囧
这个题是根据下面的规则画图
步骤1:将所有终结位置标记为必败点(P点);
步骤2: 将所有一步操作能进入必败点(P点)的位置标记为必胜点(N点)
步骤3:如果从某个点开始的所有一步操作都只能进入必胜点(N点) ,则将该点标记为必败点(P点) ;
步骤4: 如果在步骤3未能找到新的必败(P点),则算法终止;否则,返回到步骤2。
原来规律是自己推得啊?!。。。受教了
画出图来,就发现规律了
代码:
#include<iostream> #include<cstdio> #include<string> #include<cstring> using namespace std; int main() { int n,m; while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0)break; if(n%2&&m%2)printf("What a pity!\n"); else printf("Wonderful!\n"); } return 0; }
zoj 1846 http://acm.hdu.edu.cn/showproblem.php?pid=1846
估计是最裸的巴什博弈吧 公式 n%(m+1)==0则输 否则会赢
第一步取走n%(m+1)个,然后根据第二个人所取数目k,跟着他取走(m+1-k)个即可。 !!!
代码:
#include<iostream> #include<cstdio> #include<string> #include<cstring> using namespace std; int main() { int CASE,n,m; scanf("%d",&CASE); while(CASE--) { scanf("%d%d",&n,&m); if(n%(m+1)==0) printf("second\n"); else printf("first\n"); } return 0; }