可以用递归来做,
假设 有A,B两堆石子。 A的数量是x,B的是y
递归的出口是3个状态。
1:其一等于1,另一个等于2 (输)
2:其一等于1,另一个>2 (赢)
3:其一等于2,另一个>1 (赢)
另外,只需要定义 *** 作了, *** 作只能是两者之一。 其一:(de_both)两堆都减去同一数字的石子。另外一个(de_one)就是人选一堆,拿掉任意个数的石子。
递归过程如下;
void simulate(int a,int b){
switch(state)
{
case 1:
you lose
case 2:
break
case 3:
you win
}
if(abs(a,b)=1) /*这时候一定能赢*/
{
de_both(min(a,b)-1) /*两边都取走两者中最小数-1个石子,形成状态1的形式*/
}
else
{
de_one(random) /*这里的random只需要不使两者之差=1即可*/
}
simulate(a,b)
}
#include<stdio.h>#include<conio.h>
int main(void)//也就是a或者b有一项为2或者1时,有必胜方法.
{
int i, T, a[50] = { 0 }, b[50] = { 0 }, c[50] = { 0 }
scanf("%d", &T)
for (i = 0 i < T ++i)
{
scanf("%d", &a[i])
scanf("%d", &b[i])
if (a[i] == 1 || a[i] == 2 || b[i] == 1 || b[i] == 2)
c[i] = 1
}
for (i = 0 i < T ++i)
{
if (c[i] == 1)
printf("YES\n")
else
printf("NO\n")
}
getch()
return 0
}
#include <stdio.h>int main ()
{
int a,b,c
const double d=1.6180339887498948482045
while(scanf("%d%d",&a,&b)!=EOF){
if (a==b) {printf("1\n")continue}
if (a>b) {c=a-ba=b}
else c=b-a
if (a==(int)(c*d))
printf("0\n")
else printf("1\n")
}
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)