題意:
給你10*10的二維陣列代表很多燈泡,其中'#'代表按的,'O'代表亮的;如果按下那個燈泡,他自己以及四方位的燈泡就會交換狀態(亮變暗,暗變亮)
問說最少按幾次燈泡才行把全部變成按的
解法:
用暴搜。
對於除了第一行之外的燈泡,他按的位置都是固定的(因為要把他上方的燈泡變暗,不行按下去之後上方變亮,那就沒有其他燈泡可以把它變暗了)
所以可以窮舉第一排的按法,剩下的就照順序按即可
程式碼:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define INF 1<<29
char map[15][15];
char ini[15][15];
int num;
void push(int x,int y){
map[x][y] = !map[x][y];
map[x-1][y] = !map[x-1][y];
map[x+1][y] = !map[x+1][y];
map[x][y-1] = !map[x][y-1];
map[x][y+1] = !map[x][y+1];
++num;
}
int main(){
char title[1234];
int i,j,k;
int ans;
while(gets(title)){
if(!strcmp(title,"end"))break;
for(i=1;i<=10;++i){
gets(&map[i][1]);
for(j=1;j<=10;++j){
ini[i][j] = (map[i][j]=='#')?0:1;
}
}
ans = INF;
for(k=0;k<1024;++k){
for(i=1;i<=10;++i)for(j=1;j<=10;++j)map[i][j] = ini[i][j];
num = 0;
for(i=0;i<10;++i){
if((k&(1<<i))) push(1,i+1);
}
for(i=1;i<=9;++i){
for(j=1;j<=10;++j){
if(map[i][j]) push(i+1,j);
}
}
for(j=1;j<=10 && map[i][j]==0;++j);
if(j>10 && ans>num)ans = num;
}
printf("%s %d\n",title,ans);
}
return 0;
}
留言列表