题(枚举
poj1222
题意
有一个5 * 6的矩阵,每个位置表示灯,1表示灯亮,0表示灯灭。
然后如果选定位置i,j点击,则位置i,j和其上下左右的灯的状态都会反转。
现在要你求出一个5 * 6的矩阵,1表示这个灯被点击过,0表示没有。
要求这个矩阵能够使得原矩阵的灯全灭。
然后如果选定位置i,j点击,则位置i,j和其上下左右的灯的状态都会反转。
现在要你求出一个5 * 6的矩阵,1表示这个灯被点击过,0表示没有。
要求这个矩阵能够使得原矩阵的灯全灭。
解析
1.每只灯只能被点击1次,因为点击2次相当于没点。
2.点击的灯如果在矩阵的角上或者边上,反转的灯就是邻近的两个或者三个,显然,要分开讨论;
3.解题方法是枚举,但不是一个个举,那要2的30次方:假设一排一排的按,当一排上的按钮按完后,开始按下一行,那么按的按钮的上方的按钮一定是亮着的,即按完的那一排中亮着的灯的下面一个按钮,就是下一排中要按的灯;
4.枚举的必要过程是if,是询问是否该解是正确解,而这之前,要把所有可能解无漏的伦一遍,这题不能寻2的30次方,做法是寻第一排的所有解,第一排确定后其他的就都确定了。
5.思路是这样,再看操作,这题还要用到位操作;
1>用char储存一行的灯的状态,这个char是抽象的,心里不存在那么一个字符,要的只是char储存的6个bit;
2>位运算中,要操作没有=1;=0;只能|1,&0,还有^1是可以取反,通过左移1来操作char中的某位;
3>可以char result[2]; int a=2; result[1]=a; 这样来给char赋位值;