您的位置:首页 > 其它

POJ 2965 The Pilots Brothers' refrigerator(枚举+位运算)

2012-08-08 11:44 423 查看
和POJ1753翻转棋有些类似,4*4棋盘,共2^16种翻转方法,暴力枚举即可。

也有另一种方法,遇+则翻一次,统计棋盘上每个点翻转的次数,为奇数的点即所求点

//Memory: 672 KB
//Time: 875 MS
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
int i,j,k,sum=0,min=17,out;
int map[17];
int temp[17];
char a;
char b[10];
for(i=0;i<4;i++)
{	for(j=0;j<4;j++)
{
cin>>a;
if(a=='-')
map[i*4+j]=1;
if(a=='+')
map[i*4+j]=0;
}
gets(b);
}
for(i=0;i<16;i++)
temp[i]=map[i];
for(i=0;i<=65536;i++)
{
k=i;
sum=0;
for(j=0;j<16;j++)
{
if((k&1)==1)
{
sum++;
map[j%4]=map[j%4]^1;
map[4+j%4]=map[4+j%4]^1;
map[8+j%4]=map[8+j%4]^1;
map[12+j%4]=map[12+j%4]^1;
map[j-j%4]=map[j-j%4]^1;
map[j-j%4+1]=map[j-j%4+1]^1;
map[j-j%4+2]=map[j-j%4+2]^1;
map[j-j%4+3]=map[j-j%4+3]^1;
map[j]=map[j]^1;
}
k=k>>1;
}
for(j=0;j<16;j++)
if(map[j]!=1)
break;
if(j==16 && sum<min)
{
min=sum;
out=i;
}
for(j=0;j<16;j++)
map[j]=temp[j];
}
cout<<min<<endl;
for(j=0;j<16;j++)
{
if((out&1)==1)
cout<<j/4+1<<" "<<j%4+1<<endl;
out=out>>1;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: