POJ2965 The Pilots Brothers' refrigerator(枚举)

来源:互联网 发布:捷速扫描文字识别软件 编辑:程序博客网 时间:2024/05/21 08:53

http://poj.org/problem?id=2965


跟POJ1753相似,暴力枚举。我这里用了迭代加深。

#include <stdio.h>#include <string.h>int chess;int step, flag;int row[20], col[20];inline void flip(int pos) {    chess = chess^(1<<pos);    for(int i=0; i<4; ++i)        chess=chess^(1<<(pos/4*4 + i));    for(int i=0; i<4; ++i)        chess=chess^(1<<(pos%4 + i*4));}void dfs(int pos,int k) {    if(k==step) {        flag = (chess==0xFFFF);        return ;    }    if(flag || pos>15) return;    row[k] = pos/4;    col[k] = pos%4;        flip(pos);    dfs(pos+1, k+1);    flip(pos);    dfs(pos+1, k);}int main() {    int i,j;    char temp[5];    chess = 0;    for(i=0; i<4; ++i) {        scanf("%s",&temp);        for(j=0; j<4; ++j)            if(temp[j]=='-')                chess = chess^(1<<(i*4+j));    }    flag = 0;    for(step=0; step<=16; step++) { //迭代搜索深度        dfs(0,0);        if(flag)            break;    }    printf("%d\n",step);    for(i=0; i<step; ++i)        printf("%d %d\n",row[i]+1,col[i]+1);    return 0;}

高效解法:http://poj.org/showmessage?message_id=156561