T3
hmh13951417981 · · 题解
从(1,1)开始走,轮流移动,每次只能上移、右移、右上移,移动到(m,n)位置的人获胜。
类似小时候玩过的一种报数游戏,每次轮流往上加1~3,谁恰好报到30获胜。
这种简单博弈类游戏,需要从最终获胜状态往前推状态。
对手可以一步走到必位置 就是必败位置。
对手只能走到必败位置,就是必胜位置。
因为(m,n)这个点为必胜位置,那么(m-1,n),(m-1,n-1),(m,n-1)这三个点都是必败位置 (如果我们走到,对手下一步就能胜利)。
因为(m-1,n)这个位置为必败位置,(m-2,n)这个位置就是必胜位置(对手只能走到必败位置)。
用点代替必胜位置,×代替必败位置,可如此类推。
观察得:横纵坐标与终点奇偶性均相同的点为必胜点,其余为必败点。
我们如果初始位置在必胜点,我们只能走到必败点。
反之,总能会有一个方向走到必胜点。
#include<bits/stdc++.h>
using namespace std;
long long t,n,m;
int main()
{ scanf("%ld",&t);
while(t--){
scanf("%ld%ld",&n,&m);
if(n&1){
if(m&1) printf("-1\n");//必败
else printf("1\n");//向右调整横坐标
}
else{
if(m&1) printf("2\n");//向上调整纵坐标
else printf("3\n");//向右上调整横纵坐标
}
}
return 0;
}