拿子游戏
题目描述
拿子游戏是一个经典的博弈论问题,有一个堆中有一定数量的子,两个玩家轮流从中取子,每次可以取走 1 到 k 个子,最后无法取子的一方判负。现在要求你使用分治法或减治法来解决这个问题。
要求:
1.实现一个函数 int canWin(int n, int k),其中 n 是初始子的数量,k 是每次最多可以取走的子的数量。
2.使用分治法或减治法思想,递归地判断当前玩家是否能赢得游戏。
3.返回值为 1 表示当前玩家能赢得游戏,返回值为 0 表示当前玩家无法赢得游戏。
输入格式:
请输入初始子的数量 n 和每次最多可以取走的子的数量 k:
输入样例1:
5 2
输出样例1:
当前玩家能赢得游戏!
输入样例2:
55 4
输出样例2:
当前玩家无法赢得游
#include<stdio.h>
int canwin(int n, int k) {
if(n<=k) return 1;
if(n%(k+1)==0) return 0;
return !canwin(n-(n%(k+1)),k);
}
int main(){
//请在此处开始编写你的代码
int n,k;
printf("请输入初始子的数量n和每次最多可以取走的子的数量k:");
scanf("%d %d",&n,&k);
int result = canwin(n,k);
if (result) {
printf("当前玩家能赢得游戏!\n");
} else {
printf("当前玩家无法赢得游戏!\n");
}
return 0;
}