今天天气很好!

首先题意是这样的::

翻盖游戏是在一个长方形的4x4场上进行的,其16个方格中的每一个都放置了双面的棋子。每一块的一边是白色的,另一边是黑色的,每一块都是躺着的,要么是黑色的,要么是白色的。每一轮你翻转3到5块,从而改变他们的上边的颜色从黑色到白色,反之亦然。每一轮将翻转的棋子按照以下规则进行选择:

    1. 选择16件中的任何一件。
    2. 将选定的部分和所有相邻的部分翻转到左边、右边、顶部和所选部分的底部(如果有的话)。
    3. 以以下立场为例:

      bwbw
      瓦特
      bbwb
      bwwb
      在这里,“b”表示其黑色一侧向上的部分,而“w”表示其白色一侧向上的部分。如果我们选择从第3行翻转第1部分(此选择显示在图片中),则字段将成为:

      bwbw
      bwww
      瓦布
      瓦布
      游戏的目标是翻转所有的棋子,白色的一面向上或所有的碎片黑色的一面向上。您将编写一个程序,该程序将搜索实现此目标所需的最小轮数。

      1. 那么首先我用的是BFS解
      2. 2.判重用康拓展开,把状态转换成排列序号的来

      1. #include<iostream>
        #include<queue>
        #include<cstring>
        using namespace std;
        typedef struct table {
        int pic[6][6];
        }table;

        table start; //初始状态

        int P[16] = { 1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768 };
        bool vis[65536]; //状态数组
        int dist[65536];
        queue<table>Q;
        //黑0 白1
        char Negate(int ch)
        {
        if (ch)
        return 0;
        return 1;
        }

        void turn(int x, int y, table& T)
        {
        T.pic[x][y] = Negate(T.pic[x][y]); //自身
        T.pic[x][y - 1] = Negate(T.pic[x][y - 1]); //左侧
        T.pic[x][y + 1] = Negate(T.pic[x][y + 1]); //右侧
        T.pic[x - 1][y] = Negate(T.pic[x - 1][y]); //上侧
        T.pic[x + 1][y] = Negate(T.pic[x + 1][y]); //下侧
        }

        int get_dec(table T) //位压缩 
        {
        int dec = 0;
        int s = 0;
        for (int i = 4; i > 0; --i)
        for (int j = 4; j > 0; --j)
        {
        dec += T.pic[i][j] * P[s];
        s++;
        }
        return dec;
        }

        int BFS()
        {
        Q.push(start); //初始状态入队
        int st = get_dec(start); //获取索引
        vis[st] = true;
        int front = 1, rear = 2;
        table Now;
        while (front < rear)
        {
        Now = Q.front(); //头结点出队
        Q.pop();
        int index = get_dec(Now); //获取索引
        if (index == 0 || index == 65535) //找到终点
        return front;
        for (int i = 0; i < 16; ++i)
        {
        int x = i / 4 + 1; //横坐标 
        int y = i % 4 + 1; //纵坐标
        table Next = Now;
        turn(x, y, Next); //变换求下一步
        int ni = get_dec(Next);
        if (!vis[ni])
        {
        vis[ni] = true;
        Q.push(Next);
        dist[rear] = dist[front] + 1;
        rear++;
        }
        }
        front++;
        }
        return -1;
        }

        int main() {
        for (int i = 0; i < 6; ++i)
        for (int j = 0; j < 6; ++j)
        start.pic[i][j] = 0;
        memset(vis, 0, sizeof(vis));
        for (int i = 1; i <= 4; ++i)
        for (int j = 1; j <= 4; ++j)
        {
        char ch;
        cin >> ch;
        if (ch == 'w')
        start.pic[i][j] = 0;
        else
        start.pic[i][j] = 1;
        }

        int s = BFS();
        if (s != -1)
        cout << dist[s] << endl;
        else
        cout << "Impossible" << endl;
        return 0;
        }

poj-1753题题解思路的更多相关文章

  1. POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37427   Accepted: 16288 Descr ...

  2. [ACM训练] 算法初级 之 基本算法 之 枚举(POJ 1753+2965)

    先列出题目: 1.POJ 1753 POJ 1753  Flip Game:http://poj.org/problem?id=1753 Sample Input bwwb bbwb bwwb bww ...

  3. 枚举 POJ 1753 Flip Game

    题目地址:http://poj.org/problem?id=1753 /* 这题几乎和POJ 2965一样,DFS函数都不用修改 只要修改一下change规则... 注意:是否初始已经ok了要先判断 ...

  4. poj 1753 2965

    这两道题类似,前者翻转上下左右相邻的棋子,使得棋子同为黑或者同为白.后者翻转同行同列的所有开关,使得开关全被打开. poj 1753 题意:有一4x4棋盘,上面有16枚双面棋子(一面为黑,一面为白), ...

  5. POJ 1222 POJ 1830 POJ 1681 POJ 1753 POJ 3185 高斯消元求解一类开关问题

    http://poj.org/problem?id=1222 http://poj.org/problem?id=1830 http://poj.org/problem?id=1681 http:// ...

  6. ACM ICPC 2018 青岛赛区 部分金牌题题解(K,L,I,G)

     目录: K Airdrop I Soldier Game L Sub-cycle Graph G Repair the Artwork ———————————————————— ps:楼主脑残有点严 ...

  7. 穷举(四):POJ上的两道穷举例题POJ 1411和POJ 1753

    下面给出两道POJ上的问题,看如何用穷举法解决. [例9]Calling Extraterrestrial Intelligence Again(POJ 1411) Description A mes ...

  8. Codeforces Round #519 by Botan Investments(前五题题解)

    开个新号打打codeforces(以前那号玩废了),结果就遇到了这么难一套.touristD题用了map,被卡掉了(其实是对cf的评测机过分自信),G题没过, 700多行代码,码力惊人.关键是这次to ...

  9. Good Bye 2019(前五题题解)

    这套也是后来补得. 我太菜了,第三题就卡着了.想了好久才做出来,要是参加了绝对掉分. D题是人生中做完的第一道交互题,不容易. 比赛传送门 A.Card Game 题目大意:一共有n张互不相同的牌,玩 ...

随机推荐

  1. ES6必须 知道的小知识

    1.函数的默认参数 一般 我们给函数设置默认参数的时候  会在函数里用 || 运算符 比如 function show(width,height ....){ var height = height ...

  2. HDU 2068 RPG错排 [错排公式]

    1.题意:1到N的序列的排列中,元素位置与元素值相对应的情况(值为i的元素在某个排列中正好排在第i个位置)大于等于序列规模一半的情况,有多少个? 2.输入输出:每组数据一个数,N,规定输入以0结尾: ...

  3. 【题解】ARC101F Robots and Exits(DP转格路+树状数组优化DP)

    [题解]ARC101F Robots and Exits(DP转格路+树状数组优化DP) 先删去所有只能进入一个洞的机器人,这对答案没有贡献 考虑一个机器人只能进入两个洞,且真正的限制条件是操作的前缀 ...

  4. idea编辑器的使用

    编辑器下载和安装就不说了,网上每次版本都更换得好快 ,发新版的人很多idea2019:https://pan.baidu.com/s/1zc1wkQLLVxbXSjy4ISN4aQ 提取码:cgah, ...

  5. 小小知识点(十五)——origin pro 2018 安装和消除demo字样

    安装 1.安装过成中选择语言为中文或者英文,安装完成后可在注册表中切换语言. 2.安装过程中使用序列号 中文版:DF2W8-9089-7991320英文版:GF3S4-9089-7991320 3.安 ...

  6. Java散点

    1.在Java中,所有需要保存在常量池中的数据,长度最大不能超过65535,这当然也包括字符串的定义

  7. 16.用pycharm导入自己写的模块时,import无法识别的解决办法

    我们用pycharm打开自己写的代码,当多个文件之间有相互依赖的关系的时候,import无法识别自己写的文件,但是我们写的文件又确实在同一个文件夹中, 这种问题可以用下面的方法解决: 1)打开File ...

  8. Windows 7 + Tiny Linux 4.19 + XFS + Vmware Workstation 15 (PRO) 下篇dockerの奥义

    美好的事物总是来自不易,而我是一个docker新手 从以上开场,请各位follow me站在一个初学者的角度,一步一步用最简单的视角审视docker和它的真实存在 上篇预告:Windows 7 + T ...

  9. 基于Arduino的红外遥控

    1.红外接收头介绍  一.什么是红外接收头?  红外遥控器发出的信号是一连串的二进制脉冲码.为了使其在无线传输过程中免受其他红外信号的干扰,通常都是先将其调制在特定的载波频率上,然后再经红外发射二极管 ...

  10. MySQL保存 emoji 表情(微信昵称表情)

    问题分析 在微信开发过程中,总是会遇到带有emoji表情昵称的微信用户无法自动登录的问题. 后台代码抛出类似下面的异常信息. java.sql.SQLException: Incorrect stri ...