老天待我不薄,又来这么一题POJ1753
还是位运算+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的更多相关文章
- (转)一个大牛的acm历程(看着就要颤抖)
从我接触程序竞赛到现在应该有十多年了,单说ACM竞赛,从第一次非正式参赛到现在也差不多有7年多的样子.有太多的故事,想说的话,却一直没能有机会写下来.一方面是自己忙,一方面也是自己懒.所以很感谢能有人 ...
- 我的ACM参赛故事
从我接触程序竞赛到现在应该有十多年了,单说ACM竞赛,从第一次非正式参赛到现在也差不多有7年多的样子.有太多的故事,想说的话,却一直没能有机会写下来.一方面是自己忙,一方面也是自己懒.所以很感谢能有人 ...
- 第一次训练 密码:acmore
#include <cstdio> #include <cstring> #define M 100010 #define INF 0x7FFFFFFF #define Min ...
- 使用JAVA编写电话薄程序,具备添加,查找,删除等功能
//该程序需要连接数据库.根据word文档要求所有功能均已实现.//大部分方法基本差不多,//在查询修改的时候能输出 最大ID号 和最小ID号,并且可以对输入的ID号进行判断是否存在(具体方法请查看 ...
- 合并多个工作薄workbooks到一个工作薄workbook
微软示例教程 微软示例教程 Sub MergeAllWorkbooks() Dim SummarySheet As Worksheet Dim FolderPath As String Dim NRo ...
- wex5 实战 省市县三级联动与地址薄同步
无论是商城,还是快递,都要用到省市县三级联动,和地址薄,今天就以实战来制作,难点有3个: 1:三级联动,有wex5组件实现,相对简单,实战里对行数据进行了拼接 2: 地址薄选项,利用inputSel ...
- DEDECMS 留言薄模块的使用方法
一.留言薄的安装 留言薄的安装过程和其他插件一样,首先我们进入后台模块管理列表,点击其对应的“安装”: 以上步骤,我们完成了留言薄插件的安装. 二.留言薄的卸载 留言薄的卸载,同样首先我们要进入模块管 ...
- 如何把一个excel工作薄中N个工作表复制到另一个工作薄中
一般遇到标题这样的情况,许多人可能会一个一个的复制粘贴,其实完全不必那么麻烦. 你可以按以下步骤来操作: 第一步:打开所有要操作的excel工作薄\n 第二步:按住Shift键,选择所有要复制的工作表 ...
- iOS:访问地址薄
地址簿的访问 介绍: 地址簿(Address Book)是一个共享的联系人信息数据库.任何iOS应用程序都可以使用.通过提供常用联系人信息,而不是让每一个应用程序管理独立的联系人列表,可改善用户体验. ...
随机推荐
- SolidEdge如何快速绘制并完全定义槽型孔
如果你点击A之后形成的圆弧不是你想要的 你试着换个方向,如下图所示 有时候只有一个方形可以形成你要的半圆
- 消息列队 php 基于redis 实现
说明 消息列队 基于PHP 实现. 之前 用python 的 flower 实现了 列队. 今天这里我们用的是 PHP 来实现: 在实际的业务环境中 PHP 用的多些: PHP 实现列队 最重要的是用 ...
- 如何快速上手一款新的嵌入式CPU芯片(记录CC2540开发经历)
新换了工作,需要熟悉新公司的产品开发项目,更新博客就懈怠了,不过环境的不同,也让我对嵌入式开发有了更深刻的理解.在原公司我主要负责在STM32F207芯片平台上, 利用UCOS+LWIP进行嵌入式服务 ...
- location.href用法总结
javascript中的location.href有很多种用法,主要如下. self.location.href=”/url” 当前页面打开URL页面 location.href=”/url” 当前页 ...
- 查询mysql字段名和字段注释
select COLUMN_NAME,column_comment from INFORMATION_SCHEMA.Columns where table_name='表名' and table_sc ...
- 利用ctypes调用Fortran程序
本来python下面调用fortran最傻瓜方便的办法就是f2py,但是若fortran和C混合编程的代码,分别指定gfortran和gcc为编译器,在windows下面f2py直接报错 那么ctyp ...
- javascript模块化编程:CommonJS和AMD规范
AMD规范,异步模块定义.与CommonJS规范齐名并列. 作用都是利于JavaScript的模块化编程. 模块化编程的好处就是: 1.可重用 2.独立 3.能解决加载的依赖性问题 4.能解决重复加载 ...
- org.apache.flume.EventDeliveryException: NettyAvroRpcClient { host: hadoop1, port: 41414 }: Failed to send event
org.apache.flume.EventDeliveryException: NettyAvroRpcClient { host: hadoop1, port: 41414 }: Failed t ...
- 如何解决Windows的端口占用问题?
已知某应用在启动时会创建服务套接字,并将其绑定至端口8888,然而端口8888已被占用,如何解除占用? 以下为解决方案: 在cmd中运行netstat -ano|findstr 8888,其中的参数8 ...
- VC FTP服务器程序分析(四)
下面是数据传输的重点-CDataSocket类,函数不多,都比较重要. 1.OnAccept 数据tcp服务器被连接的虚函数,由框架调用. void CDataSocket::OnAccept(in ...