首页 > 其他 > 详细

水两道搜索

时间:2014-03-19 04:16:44      阅读:325      评论:0      收藏:0      [点我收藏+]

POJ 1753

BFS位运算

bubuko.com,布布扣
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;

int map[6][6];
int change[16] = { 51200, 58368, 29184, 12544, 35968, 20032, 10016, 4880, 2248,
        1252, 626, 305, 140, 78, 39, 19 };
int BFS(int state) {
    queue<pair<int, int> > Q;
    Q.push(make_pair(state, 0));
    int tmp;
    pair<int, int> cur;
    int vis[65536] = { 0 };
    while (!Q.empty()) {
        cur = Q.front();
        Q.pop();
        for (int i = 0; i < 16; i++) {
            tmp = cur.first ^ change[i];
            if (tmp == 0 || tmp == 65535)
                return cur.second + 1;
            if (!vis[tmp])
                Q.push(make_pair(tmp, cur.second + 1)), vis[tmp] = 1;
        }
    }
    return -1;
}
int main() {
//    freopen("data.txt", "r", stdin);
    char tmp;
    while (~scanf("%c", &tmp)) {
        int state = 0;
        memset(map, 0, sizeof(map));
        map[1][1] = (tmp == b) ? 1 : 0;
        if (map[1][1])
            state += 1;
        for (int i = 1; i < 4; i++) {
            scanf("%c", &tmp);
            map[1][i] = (tmp == b) ? 1 : 0;
            if (map[1][i])
                state += 1 << i;
        }
        for (int i = 2; i <= 4; i++) {
            getchar();
            for (int j = 1; j <= 4; j++) {
                scanf("%c", &tmp);
                map[i][j] = (tmp == b) ? 1 : 0;
                if (map[i][j])
                    state += 1 << ((i - 1) * 4 + j - 1);
            }
        }
        getchar();
        if (state == 0 || state == 65535) {
            puts("0");
            continue;
        }
        int ans = BFS(state);
        ans == -1 ? puts("Impossible") : printf("%d\n", ans);
    }
    return 0;
}
bubuko.com,布布扣

 

POJ 2965

要求输出操作方式,DFS迭代加深。

bubuko.com,布布扣
#include <iostream>
#include <cstdio>
using namespace std;

int chess;
int step;
bool flag = false;
int ans_r[16], ans_c[16];

void flip(int bit) {
    int row = bit / 4;
    int col = bit % 4;
    for (int c = 0; c < 4; c++)
        chess = chess ^ (1 << (row * 4 + c));
    for (int r = 0; r < 4; r++)
        chess = chess ^ (1 << (r * 4 + col));
    chess = chess ^ (1 << bit);
    return;
}

void dfs(int bit, int deep) {
    if (deep == step) {
        flag = (chess == 65535) ? 1 : 0;
        return;
    }
    if (flag || bit > 15)
        return;
    ans_r[deep] = bit / 4;
    ans_c[deep] = bit % 4;

    flip(bit);
    dfs(bit + 1, deep + 1);
    flip(bit);
    dfs(bit + 1, deep);
    return;
}

int main(void) {
//    freopen("data.txt", "r", stdin);
    char tmp;
    for (int i = 0; i < 4; i++)
        for (int j = 0; j < 4; j++) {
            scanf("%c", &tmp);
            if (tmp == -)
                chess ^= (1 << (i * 4 + j));
        }
    for (step = 0;; step++) {
        dfs(0, 0);
        if (flag)
            break;
    }
    printf("%d\n", step);
    for (int i = 0; i < step; i++)
        printf("%d %d\n", ans_r[i] + 1, ans_c[i] + 1);
    return 0;
}
bubuko.com,布布扣

水两道搜索,布布扣,bubuko.com

水两道搜索

原文:http://www.cnblogs.com/updateofsimon/p/3608757.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!