还是位运算+BFS系列题;

现在这种真是无比喜欢,今天搞了一上午这题。。。因为状态的改变写错了…T.T

#include<cstdio>
#include<queue>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std; int head,tail;
bool vis[1<<17];
int step[1<<17];
int q[1<<17]; int judge(int x)
{
if(x>=0&&x<=15)
return 1;
return 0;
} int change[16] = //16种状态转换,对应4*4的翻子位置
{
51200,58368,29184,12544,
35968,20032,10016,4880,
2248,1252,626,305,
140,78,39,19
}; int bfs(int x)
{ memset(vis,0,sizeof(vis));
memset(step,0,sizeof(step));
head=0;
tail=1; step[x]=0;
vis[x]=1;
q[head]=x; while(head<tail)
{
int v=q[head];
head++;
int ne; if(v==0||v==(65535))
{
return step[v];
} //这波状态真是写到吐血,一开始没怎么注意...
for(int i=0; i<16; i++)
{
ne=v;
int u=0;
if(i==0)
{
u=(1<<0)|(1<<1)|(1<<4);
}
else if(i==2||i==1)
{
int a,b,c;
a=i-1;
b=i+1;
c=i+4;
u=(1<<a)|(1<<b)|(1<<c);
u^=(1<<i);
}
else if(i==3)
{
u=(1<<2)|(1<<7);
u^=(1<<i);
}
else if(i==4||i==8)
{
int a,b,c;
a=i-4;
b=i+1;
c=i+4;
u=(1<<a)|(1<<b)|(1<<c);
u^=(1<<i);
}
else if(i==5||i==6||i==9||i==10)
{
int a,b,c,d;
a=i-1;
b=i+1;
c=i+4;
d=i-4;
u=(1<<a)|(1<<b)|(1<<c)|(1<<d);
u^=(1<<i);
}
else if(i==7||i==11)
{
int a,b,c;
a=i-4;
b=i-1;
c=i+4;
u=(1<<a)|(1<<b)|(1<<c);
u^=(1<<i);
}
else if(i==12)
{
u=(1<<8)|(1<<13);
u^=(1<<i);
}
else if(i==13||i==14)
{
int a,b,c;
a=i-4;
b=i+1;
c=i-1;
u=(1<<a)|(1<<b)|(1<<c);
u^=(1<<i);
}
else if(i==15)
{
u=(1<<14)|(1<<11);
u^=(1<<i);
}
ne^=u; //ne=v^change[i]; //说多了都是泪 if(!vis[ne])
{
vis[ne]=1;
step[ne]=step[v]+1;
if(ne==0||ne==(65535))
{
return step[ne];
}
q[tail++]=ne;
}
}
}
return -1;
}
int main()
{
int i,j;
char s[5][5];
while(~scanf("%s",s[0]))
{
for(i=1;i<4;i++)
scanf("%s",s[i]); int ans=0;
for(i = 0 ; i < 4 ; ++i)
{
for(j = 0 ; j < 4 ; ++j)
{
if(s[i][j]=='b')
ans|=(1<<(i*4+j));
}
}
int qq=bfs(ans);
if(qq!=-1)
printf("%d\n",qq);
else
printf("Impossible\n");
}
}
/*
bwwb
bbwb
bwwb
bwww
*/

老天待我不薄,又来这么一题POJ1753的更多相关文章

  1. (转)一个大牛的acm历程(看着就要颤抖)

    从我接触程序竞赛到现在应该有十多年了,单说ACM竞赛,从第一次非正式参赛到现在也差不多有7年多的样子.有太多的故事,想说的话,却一直没能有机会写下来.一方面是自己忙,一方面也是自己懒.所以很感谢能有人 ...

  2. 我的ACM参赛故事

    从我接触程序竞赛到现在应该有十多年了,单说ACM竞赛,从第一次非正式参赛到现在也差不多有7年多的样子.有太多的故事,想说的话,却一直没能有机会写下来.一方面是自己忙,一方面也是自己懒.所以很感谢能有人 ...

  3. 第一次训练 密码:acmore

    #include <cstdio> #include <cstring> #define M 100010 #define INF 0x7FFFFFFF #define Min ...

  4. 使用JAVA编写电话薄程序,具备添加,查找,删除等功能

    //该程序需要连接数据库.根据word文档要求所有功能均已实现.//大部分方法基本差不多,//在查询修改的时候能输出 最大ID号 和最小ID号,并且可以对输入的ID号进行判断是否存在(具体方法请查看 ...

  5. 合并多个工作薄workbooks到一个工作薄workbook

    微软示例教程 微软示例教程 Sub MergeAllWorkbooks() Dim SummarySheet As Worksheet Dim FolderPath As String Dim NRo ...

  6. wex5 实战 省市县三级联动与地址薄同步

    无论是商城,还是快递,都要用到省市县三级联动,和地址薄,今天就以实战来制作,难点有3个: 1:三级联动,有wex5组件实现,相对简单,实战里对行数据进行了拼接 2:  地址薄选项,利用inputSel ...

  7. DEDECMS 留言薄模块的使用方法

    一.留言薄的安装 留言薄的安装过程和其他插件一样,首先我们进入后台模块管理列表,点击其对应的“安装”: 以上步骤,我们完成了留言薄插件的安装. 二.留言薄的卸载 留言薄的卸载,同样首先我们要进入模块管 ...

  8. 如何把一个excel工作薄中N个工作表复制到另一个工作薄中

    一般遇到标题这样的情况,许多人可能会一个一个的复制粘贴,其实完全不必那么麻烦. 你可以按以下步骤来操作: 第一步:打开所有要操作的excel工作薄\n 第二步:按住Shift键,选择所有要复制的工作表 ...

  9. iOS:访问地址薄

    地址簿的访问 介绍: 地址簿(Address Book)是一个共享的联系人信息数据库.任何iOS应用程序都可以使用.通过提供常用联系人信息,而不是让每一个应用程序管理独立的联系人列表,可改善用户体验. ...

随机推荐

  1. 锤子Smartisan T1手机官方4.4.2系统内核版本号信息

    从锤子smartisan T1手机官方系统EGL中获取内核版本号信息(由cofface提供): I/Adreno-EGL(  816): <qeglDrvAPI_eglInitialize:41 ...

  2. SolidEdge如何为零件指定不同的颜色 给零件着色 给装配体着色

    格式-零件画笔 可以给零件的一个表面,或者一个特征着色   如果要指定不同的色彩,可以在格式-样式-面样式中修改   如果是给装配体着色,则点击任意零件,在"无"的选项卡里面修改颜 ...

  3. 分布式搜索elasticsearch 基本概念

    ElasticSearch官网:http://www.elasticsearch.org/ 先上一张elasticsearch的整体框架图: ElasticSearch是基于Lucene开发的分布式搜 ...

  4. Yii Criteria常用方法(select,join,where,日期,)

    $criteria = new CDbCriteria;  //select $criteria->select = '*';//默认* $criteria->select = 'id,n ...

  5. WCF 内存入口检查失败 Memory gates checking failed

    在做JC系统时,出现这样的错误: 出现该错误信息的原因是因为WCF服务激活之前,系统应该具有的最小内存量不足config文件中设置的百分比.我是在本机调试的时候出现的. 解决方法:        关闭 ...

  6. poj2595(凸包)

    Min-Max Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2192   Accepted: 502 Descriptio ...

  7. QEMU+GDB调试方法

    两年前调试usb/ip开源项目时,就曾用虚拟机远程调试过Windows和Linux系统内核,当时在VMware Workstation上创建两个虚拟机进行调试,也没有记录下如何配置调试,只是大体的还记 ...

  8. 使用mysql导入数据时关掉binlog

    在my.cnf中注释掉 log-bin=bin-log参数然后重启数据库

  9. 编程算法 - 数组中出现次数超过一半的数字 代码(C)

    数组中出现次数超过一半的数字 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 数组中有一个数字出现的次数超过数组长度的一半, 请找出这个数字. ...

  10. Spark 学习笔记:(三)Spark SQL

    参考:https://spark.apache.org/docs/latest/sql-programming-guide.html#overview http://www.csdn.net/arti ...