编程新手的第二篇题解,大家可以参考一下。若鄙人理解有误,望不吝指正。
首先要搞清楚博弈中的“最佳策略”处理是什么意思?意思是双方都不会让步,走的都是当前形势下最好的一步,不管结果如何。我觉得在很多的博弈中,“最好”这个词有两个含义:一个是给自己留了最好的后路,也就是靠边涂色,让自己的每一次涂色后考虑下一步时更为轻松;另一个是多买多占的思路(这道题目显然不行,因为要求了同颜色不能相邻)。针对这次博弈,我们应该选哪种呢?注意我们的目标是:让对方尽可能在自己没格子之前不能进行涂色。言下之意就是,自己要尽可能地多走。
由此可见,这次博弈的双方一定会选择涂满格子,不论是对个人的策略选择还是站在全局眼光,这都是最佳策略。而这种选择,就注定了比赛的结果:若格子总数为偶数,那么后手赢;若格子总数为奇数,那么先手赢。我的分析到此为止,下面是代码实现:(当然,不一定要格子总数,其实直接判断n和m的某一个的奇偶性就行,写成n*m是我的思维习惯)
#include<stdio.h>
int main(){
long long n,m,a;
scanf("%lld %lld",&n,&m);
a=n*m;
if(a%2==0)printf("yukari");
else printf("akai");
return 0;
}