• Flip Game


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

    题意:有一个4*4的方格,每个方格中有一粒棋子,棋子一面为白色,一面为黑色。每次翻转一粒棋子,则它周围的棋子也随之翻转,直至方格全为黑棋或全为白棋,输出最少的翻转次数,如果不可能达到此种状态,输出Impossible。

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<queue>
     4 #include<iostream>
     5 using namespace std;
     6 struct node
     7 {
     8     int step;//步数
     9     int state;//状态
    10 };
    11 int vis[65538];
    12 int f[16] =
    13 {
    14     51200,58368,29184,12544,35968,20032,10016,4880,2248,1252,626,305,140,78,39,19
    15 };//16种状态转换
    16 int bfs(int state1)
    17 {
    18 
    19     queue<struct node>q;
    20     struct node pre,next;
    21     pre.state = state1;
    22     pre.step = 0;
    23     q.push(pre);
    24     vis[state1] = 1;//标记已被访问过的状态
    25     while(!q.empty())
    26     {
    27         pre = q.front();
    28         q.pop();
    29         if(pre.state==0 || pre.state==65535)
    30             return pre.step;
    31         for (int i = 0; i < 16; i ++)
    32         {
    33             next.state = pre.state^f[i];//异或产生新状态
    34             next.step = pre.step + 1;
    35             if(next.state==0 || next.state==65535)
    36                 return next.step;
    37             if(!vis[next.state])
    38                 q.push(next);//进队列
    39             vis[next.state] = 1;
    40         }
    41     }
    42     return -1;
    43 }
    44 int main()
    45 {
    46     int i,j;
    47     int state = 0;
    48     char str[5][5];
    49     memset(vis,0,sizeof(vis));
    50     for (i = 0; i < 4; i ++)
    51         scanf("%s",str[i]);
    52     for (i = 0; i < 4; i ++)
    53     {
    54         for (j = 0; j < 4; j ++)
    55         {
    56             state <<= 1;//转换成二进制
    57             if (str[i][j]=='b')
    58                 state+=1;
    59         }
    60     }
    61     int ans =  bfs(state);
    62     if(ans == -1)
    63         printf("Impossible
    ");
    64     else
    65         printf("%d
    ",ans);
    66     return 0;
    67 }
    View Code
  • 相关阅读:
    321list,元组,range**数字是不可迭代的!
    320作业
    320基础数据类型初始
    319作业
    316作业
    319 Python基础之格式化输出、逻辑运算符、编码、in not in、while else、
    windows查看端口占用指令
    2016年学习计划
    刷算法的时候有没有必要自写测试用例?
    我们为什么不能只用O记号来谈论算法?
  • 原文地址:https://www.cnblogs.com/lahblogs/p/3234380.html
Copyright © 2020-2023  润新知