博弈题
意思大概是有一个棋盘,黑子总在白子上面,黑子只能往下走,白子只能网上走,在底部或者在顶部的棋子可以选择走一步或者走两步,哪方无法挪动棋子了算输,问:从白子开始挪动棋子,哪方可以获胜
1.特殊考虑n==4的情况
2.n>4时不用考虑双方都在顶端的情况,因为如果可以在其他列完成后获胜,在后手进入该状态也能获胜
3.其他情况因为白先手,只要先把对方逼的不得不走joker(在底部或在顶部的棋子)即可以获胜:及movew<moveb
4.如果movew==moveb或者movew==moveb+1时,当moveall%2==1时,白色也可以获胜(因为没有人有移动两格的机会)
#include<iostream>
using namespace std;
char map[50][50];
int main(){
int T;
cin>>T;
int n,m;
while (T--){
cin>>n>>m;
int posw,posb,cnt;
for (int i=0;i<n;i++) cin>>map[i];
int movew=0;
int moveb=0;
int k=0;
int moveall=0;
for (int j=0;j<m;j++){
for (int i=0;i<n;i++){
if (map[i][j]=='B') posb=i;
if (map[i][j]=='W') posw=i;
}
cnt=posw-posb-1;
if (posw==n-1&&posb==0&&n>3){
k++;
}
else{
if (posb==0&&posw>2) movew+=(posw-2);
else if (posw==n-1&&posb<n-3) moveb+=(n-3-posb);
moveall+=cnt;
}
}
if ( n==4 && k%2==1 || movew<moveb || movew<=moveb+1 && moveall%2==1 ) cout<<"White wins"<<endl;
else cout<<"Black wins"<<endl;
}
}
博弈