题目链接:HDU 2177 取(2堆)石子游戏
题解:威左夫博弈,先行者胜时单边取枚举,判断是否留给对手必败态
PS:最近没怎么刷过题了,代码未优化,略长o(^▽^)o
#include<iostream>
#include<cmath>
using namespace std;
double a, b;
void f(int data)
{
if(a > data)
cout << data << " " << b-a+data << endl;
for(int i = 1; i < a;i++){
int k1 = b-a+i;
int data1 = floor(k1*(1.0+sqrt(5.0))/2.0);
if(data1 == a-i)
cout << a-i << " " << b << endl;
}
for(int i = 1; i < b - a;i++){
int k1 = b -i -a;
int data1 = floor(k1*(1.0+sqrt(5.0))/2.0);
if(data1 == a)
cout << a << " " << b-i << endl;
}
for(int i = b - a -1; i < b; i++){
int k1 = a - b + i;
int data1 = floor(k1*(1.0+sqrt(5.0))/2.0);
if(data1 == b-i)
cout << b-i << " " << a << endl;
}
}
int main()
{
while(cin >> a >> b,a+b){
int k = b - a;
int data = floor(k*(1.0+sqrt(5.0))/2.0);
if (data == a) cout << 0 << endl;
else {
cout << 1 << endl;
if(a == b){
cout << 0 << " " << 0 << endl;
cout << a-1 << " " << b << endl;
}
else f(data);
}
}
return 0;
}