poj1753(状态压缩 + bfs)

题意:给你一个4 x 4的正方形,共有16个格子,每个格子要么是黑色,要么是白色。当把一个格子的颜色改变(黑->白 或者 白->黑)时,其周围(上下左右)(如果存在的话)的格子的颜色也被反转,问至少反转几个格子可以使这个4 x 4的正方形变为纯白或者纯黑?如果初始状态已经达到要求输出0。如果不可能完成,就输出Impossible。

Sample Input

bwwb
bbwb
bwwb
bwww

Sample Output

4

思路:状态压缩 + bfs。
参考:http://blog.csdn.net/hackbuteer1/article/details/7392245

#include <iostream>
#include <cstring>
#include <queue>
#include <utility>
using namespace std;

const int MAX_N = 65535 + 5;
bool vis[MAX_N];
int state[16];
int dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};

void init() {//枚举每一种状态
    for (int i = 0; i < 4; ++i)
        for (int j = 0; j < 4; ++j) {
            int val = 1 << (15 - (i * 4 + j));
            for (int d = 0; d < 4; ++d) {
                int x = i + dir[d][0];
                int y = j + dir[d][1];
                if (x < 0 || y < 0 || x >= 4 || y >= 4)
                    continue;
                val ^= (1 << (15 - (x * 4 + y)));
            }
            state[i * 4 + j] = val;
        }
}

typedef pair<int, int> p;

int bfs(int val) {
    memset(vis, 0, sizeof(vis));
    queue<p> que;
    que.push((p){val, 0});//first表示当前状态值,second表示当前走的步数
    vis[val] = true;
    while (!que.empty()) {
        p k = que.front();
        que.pop();
        if (k.first == 0 || k.first == 65535) return k.second;
        for (int i = 0; i < 16; ++i) {
            p next;
            next.first = k.first ^ state[i];
             next.second = k.second + 1;
            if (!vis[next.first]) {
                que.push(next);
                vis[next.first] = true;
            }
        }
    }
    return -1;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    init();
    int val = 0;
    for (int i = 0; i < 4; ++i) {
        string s;
        cin >> s;
        for (int j = 0; j < 4; ++j) {
            if (s[j] == 'b')
                val ^= (1 << (15 - (i * 4 + j)));
        }
    }
    int ans = bfs(val);
    if (ans == -1) cout << "Impossible" << endl;
    else cout << ans << endl;
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,768评论 0 33
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,854评论 18 139
  • 1. 关于诊断X线机准直器的作用,错误的是()。 (6.0 分) A. 显示照射野 B. 显示中心线 C. 屏蔽多...
    我们村我最帅阅读 10,808评论 0 5
  • 说到《道德经》可能大家可能都有所耳闻,那里周朝春秋年代的老年人老子用他的见识与智慧以及对所著。 所谓诸子百家...
    ai糊弄阅读 410评论 4 2
  • 记得还在家乡时,去小镇上的商场应聘收银员,人事主管挤眉弄眼表情夸张的哟了一声,扔给我一件暗红色的工作服,她当时说的...
    南方姑娘NF阅读 906评论 2 6