当前位置: 首页 > news >正文

poj1753-Flip Game BFS+位运算

 

题目大意:有一个4*4的方格,每个方格中放一粒棋子,这个棋子一面是白色,一面是黑色。游戏规则为每次任选16颗中的一颗,把选中的这颗以及它四周的棋子一并反过来,当所有的棋子都是同一个颜色朝上时,游戏就完成了。现在给定一个初始状态,要求输出能够完成游戏所需翻转的最小次数,如果初始状态已经达到要求输出0。如果不可能完成游戏,输出Impossible。

主要思想:

1.如果用一个4*4的数组存储每一种状态,不但存储空间很大,而且在穷举状态时也不方便记录。因为每一颗棋子都只有两种状态,所以可以用二进制0和1表示每一个棋子的状态,则棋盘的状态就可以用一个16位的整数唯一标识。而翻转的操作也可以通过通过位操作来完成。显然当棋盘状态id为0(全白)或65535(全黑)时,游戏结束。

2.对于棋盘的每一个状态,都有十六种操作,首先要判断这十六种操作之后是否有完成的情况,如果没有,则再对这十六种操作的结果分别再进行上述操作,显然这里就要用到队列来存储了。而且在翻转的过程中有可能会回到之前的某种状态,而这种重复的状态是不应该再次入队的,所以维护Vis[i]数组来判断id==i的状态之前是否已经出现过,如果不是才将其入队。如果游戏无法完成,状态必定会形成循环,由于重复状态不会再次入队,所以最后的队列一定会是空队列。

3.由于0^1=1,1^1=0,所以翻转的操作可以通过异或操作来完成,而翻转的位置可以通过移位来确定

 

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
#define Max 65535
int queue[Max*2];                 //BFS算法中的队列
int step[Max];                   //记录是翻第几次
int vis[Max];                   //记录是否翻过这种状态
int tab=0;                     //记录是否能翻成功
void bfs(int s){
    int head=0,rear=0;
    step[s]=0;
    if(s==0||s==Max){
        printf("%d\n",0);
        tab=1;
        return;
    }
    queue[rear++]=s;
    vis[s]=1;
    while(head<rear){
        int temp=queue[head++];
        int t=temp;
        for(int i=0;i<16;i++){
            temp=t;              //为下一次翻棋子保护状态
            temp^=1<<(15-i);
            int tm; 
            int label=15-i;
            tm=label+4;            //处理上边的棋子  
            if(tm!=19&&tm!=18&&tm!=17&&tm!=16)  
                temp^=1<<tm;  
            tm=label-4;            //处理下边的棋子  
            if(tm!=-1&&tm!=-2&&tm!=-3&&tm!=-4)  
                temp^=1<<tm;  
            tm=label+1;            //处理左边的棋子  
            if(tm!=16&&tm!=12&&tm!=8&&tm!=4)  
                temp^=1<<tm;  
            tm=label-1;            //处理右边的棋子  
            if(tm!=11&&tm!=7&&tm!=3&&tm!=-1)  
                temp^=1<<tm; 
            if(temp==0||temp==65535){
                printf("%d\n",step[t]+1);
                tab=1;
                return;
            }
            if(vis[temp]==0){
                queue[rear++]=temp;
                vis[temp]=1;
                step[temp]=step[t]+1;
            }
        }
    }
}
int main(){
    int i,j;
    char color;
    int id=0;
    for(i=0;i<4;i++)
      for(j=0;j<4;j++)
      {
          cin>>color;
          id<<=1;
          if(color=='b') id+=1;              //计算当前状态
          
      }  
     bfs(id);
     if(tab==0) printf("Impossible");
     return 0;
}

 

转载于:https://www.cnblogs.com/lvcoding/p/6610844.html

相关文章:

  • 对 Git 分支 master 和 origin/master 的一些认识
  • 不要做干自己没时间做的事
  • @Not - Empty-Null-Blank
  • vagrant学习笔记
  • jquery widgets 弹框
  • Linux系统管理命令之权限管理
  • ReactNative开发常用的三方模块
  • Linq to entity 执行多个字段排序的方法
  • maven学习:java编译插件与去除测试插件
  • 机器的自我进化
  • 取汉子拼音首字母的VB.Net方法
  • TP90 95 99指标
  • 阿里双十一大促,技术准备只做了这两件事情?
  • 很反感
  • 6410键盘应用程序的开发
  • [数据结构]链表的实现在PHP中
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • classpath对获取配置文件的影响
  • ES6语法详解(一)
  • Javascript弹出层-初探
  • JavaScript的使用你知道几种?(上)
  • jQuery(一)
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • 程序员该如何有效的找工作?
  • 关于extract.autodesk.io的一些说明
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 提醒我喝水chrome插件开发指南
  • 小程序测试方案初探
  • 译米田引理
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • ​虚拟化系列介绍(十)
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (实战篇)如何缓存数据
  • (五)网络优化与超参数选择--九五小庞
  • (循环依赖问题)学习spring的第九天
  • (原創) 物件導向與老子思想 (OO)
  • (转)详解PHP处理密码的几种方式
  • .NET开源项目介绍及资源推荐:数据持久层
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • /etc/motd and /etc/issue
  • [ C++ ] 继承
  • [ Linux ] git工具的基本使用(仓库的构建,提交)