原题地址:http://bailian.openjudge.cn/practice/2813/
思路完全和熄灯问题一致,代码如下:
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
//解题思路跟熄灯问题完全一样,代码参照郭炜老师熄灯问题代码,枚举第一行的状态,则后面所有行状态都已经确定;
//用16位的short型存储每个方块的状态,1表示白色,0表示黄色。
void setbit(short&a,int i,int v){ //初始化墙块状态函数
if(v) a|=(1<<i);
else a&=~(1<<i);
}
int getbit(short a,int i){ //获取某位二进制数的值
return (a>>i)&1;
}
void flip(short&a,int i){ //翻转某位二进制的值
a^=(1<<i);
}
int count(short a){ //判断二进制数里面1的个数,用来统计需要操作的步数;
int num=0;
while(a!=0){
a=a&a-1;
num++;
}
return num;
}
int main()
{
char s[16][16];
int n;
int min=1<<30;
short op; //op用来表示当前行的操作情况,1表示需要涂黄;
cin>>n;
short *ori=new short[n]