题目:Alice还有Bob 轮流在已知的15中俄罗斯方块上放置瓷砖,Alice放置的是垂直的2*1的矩形;
Bob放置的是水平的1*2的矩形,Alice 先开始放,最后没位置可以放者输,判断胜者。
分析:博弈,贪心。一看到以为是博弈,结果直接贪心过了。
首先,相同形状的方块压缩,一共有8中不同的方块。得到A,B优先级:
(每次,取自己最优且给对手最大困扰的发难,1只能A拿,2只能B拿,所以最后再用)
A:15 > 5 > 3 > 11 > 7 > 9 > 1; B:15 > 3 > 5 > 11 > 9 > 7 > 2;
按这个策略贪心模拟即可。
说明:(2011-09-19 01:05)。
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int t,n[ 16 ];
while ( cin >> t )
for ( int i = 1 ; i <= t ; ++ i ) {
for ( int j = 1 ; j <= 15 ; ++ j )
cin >> n[ j ];
n[ 3 ] += n[ 4 ];
n[ 5 ] += n[ 6 ];
n[ 7 ] += n[ 8 ];
n[ 9 ] += n[ 10 ];
n[ 11 ] += n[ 12 ];
n[ 11 ] += n[ 13 ];
n[ 11 ] += n[ 14 ];
int A = 2*n[ 1 ],B = 2*n[ 2 ];
// cout << A << " " << B << endl;
while ( 1 ) {
// cout << "!!!" << endl;
if ( n[ 15 ] ) {
A += 2;
-- n[ 15 ];
}else if ( n[ 5 ] ) {
A += 2;
-- n[ 5 ];
}else if ( n[ 3 ] ) {
A += 1;
-- n[ 3 ];
}else if ( n[ 11 ] ) {
A += 1;
-- n[ 11 ];
}else if ( n[ 7 ] ) {
A += 1;
-- n[ 7 ];
}else if ( n[ 9 ] ) {
A += 1;
B += 1;
-- n[ 9 ];
}else break;
if ( n[ 15 ] ) {
B += 2;
-- n[ 15 ];
}else if ( n[ 3 ] ) {
B += 2;
-- n[ 3 ];
}else if ( n[ 5 ] ) {
B += 1;
-- n[ 5 ];
}else if ( n[ 11 ] ) {
B += 1;
-- n[ 11 ];
}else if ( n[ 9 ] ) {
B += 1;
-- n[ 9 ];
}else if ( n[ 7 ] ) {
A += 1;
B += 1;
-- n[ 7 ];
}else break;
// cout << "??" << endl;
}
if ( A > B )
cout << "Case #" << i << ": Alice" << endl;
else cout << "Case #" << i << ": Bob" << endl;
}
return 0;
}