一:巴什博弈:
acm 例题 北京师范大学oj:http://oj.51isoft.com/contest/problem_show.php?pid=23384
post code:
#include<stdio.h> int main() { int n,num,m; scanf("%d",&n); while(n--) { scanf("%d %d",&num,&m); if(num<=m)printf("player1 wins\n"); else { if(num%(m+1)==0)printf("player2 wins\n"); else printf("player1 wins\n"); } } }
必死局的判定:
如果 a遇到了6,10 ,须变化一次,只能对角线,竖着,横着变化。
b仅一次就可以将其变化成为 图中的死局。
因为 在(6,10)之前含有 (1,2)(3,5)(4,7) 横纵都包含了 1-5,向上和往对角线方向都被封死了,都可以转化到这三个数。
只能横着走:
但会被(1,1)(1,2)(3,5)(4,7)对角线封锁,
例如 a遇到(6,10) 竖向变成(3,10),因为包含数字3,则可以转化为(3,5);a将又一次面临死局。
横向变成(6,8),在(3,5)的对角线上,所以可以直接的转化成(3,5);
横向变成(6,6),a直接两个都减去6,致使b输掉了。
必死局的判定:死局的前几项是:(0,0)、(1,2)、(3,5)、(4,7)、(6,10(8,13)、(9,15)、(11,18)、
#include<stdio.h> int main() { int n,i,a[200010],num,j; while(scanf("%d",&n)&&n!=0) { i=1; scanf("%d",&num); a[i]=num; for(i=2;i<=n;i++) { scanf("%d",&a[i]); num=num^a[i]; } if(num==0)printf("No\n"); else { printf("Yes\n"); for(i=1;i<=n;i++) { if(a[i]>(a[i]^num)) printf("%d %d\n",a[i],a[i]^num); } } } }
算法描述:判断他们的异或是否为0;
为0则成立;
不为0 输出你要取出的值,即每个元素遍历一遍,找出 其他值异或小于他的结果,然后进行输出:这样就得出了正确答案。
上面这句话是关键: 在不断得寻找找必败态和必胜态, 将其赋值给给出的初始数据,最后的到自己想要的结果。
#include<stdio.h> void swap(int &a,int &b); int fun(int a,int b); int main() { int a,b,result; while(scanf("%d %d",&a,&b)&&(a!=0||b!=0)) { if(a<b)swap(a,b); result=fun(a,b); //寻找输入数据的状态。 if(result==1)printf("Stan wins\n"); else printf("Ollie wins\n"); } } void swap(int &a,int &b) { int temp; temp=a; a=b; b=temp; } int fun(int a,int b) { if(a%b==0)return 1; else {if( fun(b,a%b)&&(a/b==1) ) 对于其中的定量描述;就如同上面所描述的。 return 0 ; else return 1; } }