题目大意:棋盘上白棋子Alice先手,黑棋子Bob后手。白棋子只能向下三个位置,黑棋子只能向上三个位置,谁先走到对方棋子位置就获胜。两个棋子起点一定不相同。
分析:显然问题是有规律性的,如果白棋子在下而黑棋子在上,那么一定平局。
继续分析如果两个棋子行数差距为奇数先手赢,偶数后手赢。
以奇数行差距为例,后手玩家为避免被吃掉,走棋时一定要尽可能远离白棋,
情况1:如果起始两个棋子列数差为1或者0,那么白棋先走可以始终保持在黑棋正上方,黑棋必败。
情况2:列数差大于等于2,此时黑棋走棋趋势为加大这个列数差,白棋一定减少这个列数差。如果棋盘无限大,那么必然平局。但是棋盘不是无限大,黑棋每逃离一次,白棋追赶一次,两个棋子行数差会减少2.以此为判定条件,问题可解。
ps:需要注意初始时两个棋子列数差也要考虑进去。为方便阅读,代码没有进行公式化简
#include <iostream>
using namespace std;
int main()
{
int t,n,m,a,b,c,d;
cin>>t;
while(t--)
{
cin>>n>>m>>a>>b>>c>>d;
if(a>=c)
cout<<"Draw\n";
else if((c-a)%2==0 ) /**< 后手赢 */
{ /**< (b-d)-1+m-b,前面(b-d)-1为原始差距,后面m-b是逃离最大距离,两部分的和大于行差除2,可以逃离 */
if(b-d>=1&&(b-d)-1+m-b>=(c-a)/2||d-b>=1&&d-b-1+b-1>=(c-a)/2)
cout<<"Draw\n";
else
cout<<"Bob\n";
}
else
{
if(d-b>=2&&d-b-2+m-d>=(c-a)/2||b-d>=2&&b-d-2+d-1>=(c-a)/2)
cout<<"Draw\n";
else
cout<<"Alice\n";
}
}
return 0;
}