題意:

給你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;
}

arrow
arrow
    全站熱搜

    alan790712 發表在 痞客邦 留言(0) 人氣()