您的位置:首页 > 其它

vijos P1197 费解的开关 题解

2016-02-03 13:08 330 查看
4000

#include <stdio.h>
#include <stdlib.h>

#define STATUS 0
#define STEP 1

int 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: