vijos P1197 费解的开关 题解

来源:互联网 发布:js面包屑导航代码 编辑:程序博客网 时间:2024/05/21 17:56
#include <stdio.h>#include <stdlib.h>#define STATUS 0#define STEP 1int queue[1000000][2];int answer[1<<25];int head = 0, tail = 0;void addToQueue(int status, int step){    queue[tail][STATUS] = status;    queue[tail][STEP] = step;    answer[status] = step;    tail++;}int main(){    char line[10];    int numQuery, i, j, k, step, status;    for(i=0; i<(1<<25); i++)        answer[i] = -1;    addToQueue((1<<25)-1, 0);  //all lights up    while(head < tail){        status = queue[head][STATUS];        step = queue[head][STEP];        if(step < 6){            for(i=0; i<25; i++){                k = status;                // generate new status                k ^= 1<<i;  //itself                if(i%5 != 0)                    k ^= 1<<(i-1);  //left                if(i%5 != 4)                    k ^= 1<<(i+1);  //right                if(i/5 != 0)                    k ^= 1<<(i-5);  //up                if(i/5 != 4)                    k ^= 1<<(i+5);  //down                if(answer[k] == -1)                    addToQueue(k, step+1);            }        }        head++;    }    scanf("%d", &numQuery);    for(i=0; i<numQuery; i++){        status = 0;        for(j=0; j<5; j++){            scanf("%s", line);            for(k=0; k<5; k++){                status <<= 1;                status |= line[k]-'0';            }        }        printf("%d\n", answer[status]);    }    return 0;}

1 0