一,思路:
1.这是一道博弈论的题目(两个人都绝顶聪明,所以每个人都会按最优方案进行)。这题你会发现,两个人从一开始就已经确定了结局。
2.如假如他们俩的棋子在竖直方向上距离相差的值是偶数,那么一定就两个结果Alice赢或者平局,反之奇数则是Bob赢或者平局(仔细分析一下就能得知)。
3.所以换位思考一下,当你知道你一定赢不了,那么你肯定是尽量争取平局,所以你肯定会逃跑,则另一个人则是追。那么现在问题就变成,他能不能追上。那么判断能否追上其实只要看他们交汇的哪一行他们横向方向上的位置情况来分析。(具体看注释)。
二,代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=2e5+10;
typedef long long ll;
typedef pair<int,int> pii;
void Solved() {
//这里我刚开始,没注意题目的x是指上下方向,我这里是左右方向
int h,w,x1,x2,y1,y2;
cin>>h>>w>>y1>>x1>>y2>>x2;
//假如一开始就在同一行或者错开了,那么肯定平局。
if((y2-y1)<=0){
cout<<"Draw"<<endl;
return;
}
if((y2-y1)%2!=0){
//Alice赢或者平局
int t1,t2;
//根据x1和x2的相对位置,确定追击和逃跑方向
if(x1<x2){
//注意不能出边界
//这里是直接算出,他们到达交界出分别可以走(y2-y1)/2+1,(y2-y1)/2步。
t1=min(x1+(y2-y1)/2+1,w);
t2=min(x2+(y2-y1)/2,w);
if(t1>=t2) cout<<"Alice"<<endl;
else cout<<"Draw"<<endl;
}else{
t1=max(x1-(y2-y1)/2-1,1);
t2=max(x2-(y2-y1)/2,1);
if(t1<=t2) cout<<"Alice"<<endl;
else cout<<"Draw"<<endl;
}
}else{
//Bob赢或者平局
int t1,t2;
if(x1<x2){
t1=max(x1-(y2-y1)/2,1);
t2=max(x2-(y2-y1)/2,1);
if(t2<=t1) cout<<"Bob"<<endl;
else cout<<"Draw"<<endl;
}else{
t1=min(x1+(y2-y1)/2,w);
t2=min(x2+(y2-y1)/2,w);
if(t2>=t1) cout<<"Bob"<<endl;
else cout<<"Draw"<<endl;
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t;
cin>>t;
while(t--) {
Solved();
}
return 0;
}
标签:typedef,y2,cout,Chip,Codeforces,include,y1,平局,Round
From: https://blog.csdn.net/qq_75103498/article/details/136837590