poj2046
| Time Limit: 5000MS | Memory Limit: 65536K | |
| Total Submissions: 1829 | Accepted: 829 |
Description
You have 28 cards labeled with two-digit numbers. The first digit (from 1 to 4) represents the suit of the card, and the second digit (from 1 to 7) represents the value of the card.
First, you shu2e the cards and lay them face up on the table in four rows of seven cards, leaving a space of one card at the extreme left of each row. The following shows an example of initial layout. 
Next, you remove all cards of value 1, and put them in the open space at the left end of the rows: "11" to the top row, "21" to the next, and so on.
Now you have 28 cards and four spaces, called gaps, in four rows and eight columns. You start moving cards from this layout. 
At each move, you choose one of the four gaps and fill it with the successor of the left neighbor of the gap. The successor of a card is the next card in the same suit, when it exists. For instance the successor of "42" is "43", and "27" has no successor.
In the above layout, you can move "43" to the gap at the right of "42", or "36" to the gap at the right of "35". If you move "43", a new gap is generated to the right of "16". You cannot move any card to the right of a card of value 7, nor to the right of a gap.
The goal of the game is, by choosing clever moves, to make four ascending sequences of the same suit, as follows. 
Your task is to find the minimum number of moves to reach the goal layout.
Input
Each layout consists of five lines - a blank line and four lines which represent initial layouts of four rows. Each row has seven two-digit numbers which correspond to the cards.
Output
Sample Input
4 12 13 14 15 16 17 21
22 23 24 25 26 27 31
32 33 34 35 36 37 41
42 43 44 45 46 47 11 26 31 13 44 21 24 42
17 45 23 25 41 36 11
46 34 14 12 37 32 47
16 43 27 35 22 33 15 17 12 16 13 15 14 11
27 22 26 23 25 24 21
37 32 36 33 35 34 31
47 42 46 43 45 44 41 27 14 22 35 32 46 33
13 17 36 24 44 21 15
43 16 45 47 23 11 26
25 37 41 34 42 12 31
Sample Output
0
33
60
-1
Source
问最少需要几次操作,达到图片3的状态
#include<cstdio>
#include<cstring>
using namespace std;
const int M=;
struct data
{
char s[],e[],p[];
int ans;
}w[];
int id[M],ans;
inline int BKDRHash(char *str)
{
int hash=,q=;
while(++q<)hash=hash*+(*str++);
return((hash&0x7FFFFFFF)%M);
}
inline void insert(char *c,int i)
{
int x=BKDRHash(c);
while(id[x]>=)
{
x+=;
if(x>=M)x%=M;
}
id[x]=i;
}
inline bool cmp(char *p,char *q)
{
for(int i=;i<;++i,++p,++q)
if(*p!=*q)return ;
return ;
}
inline int find(char *c)
{
int x=BKDRHash(c);
while(id[x]>=&&cmp(c,w[id[x]].s))
{
x+=;
if(x>=M)x%=M;
}
return id[x];
}
inline void get(char &a)
{
char ch=getchar();
while (ch<''||ch>'')ch=getchar();
for(a=;ch>=''&&ch<='';ch=getchar())a=a*+ch-;
if((a==)||(a==)||(a==)||(a==))a=;
}
inline void cpy(char *p,char *q,int n)
{
for(int i=;i<n;++i,++p,++q)*p=*q;
}
inline int bfs()
{
int l=,r=,rr=,i,k,s,p,e;
do
{
cpy(w[rr].s,w[++l].s,);
for(i=;i<;++i)
if(w[l].s[(e=w[l].e[i])-]%<&&w[l].s[e-]>)
{
w[rr].s[e]=s=w[l].s[e-]+,w[rr].s[p=w[l].p[s]]=;
if((k=find(w[rr].s))<)
{
++r,++rr,cpy(w[r].e,w[l].e,),cpy(w[r].p,w[l].p,);
w[r].e[i]=p,w[r].p[s]=e,w[r].ans=w[l].ans+;
insert(w[r].s,r);
cpy(w[rr].s,w[l].s,);
}
else w[rr].s[p]=s,w[rr].s[e]=;
if(!k)return w[l].ans+;
}
}while(l<r);
return -;
}
int main()
{
int n,i,j,k;
for(i=;i<;i+=)
for(j=;j<;++j)w[].s[i+j]=(i/+)*+j+;
scanf("%d",&n);
while(n--)
{
memset(id,-,sizeof(id));
insert(w[].s,);
for(i=;i<;i+=)
for(w[].s[i]=(i/+)*+,j=;j<;++j)get(w[].s[i+j]),w[].p[w[].s[i+j]]=i+j;
if(!find(w[].s))printf("0\n");
else
{
for(k=i=;i<;i+=)
for(j=;j<;++j)
if(!w[].s[i+j])w[].e[k++]=i+j;
w[].ans=;
insert(w[].s,);
printf("%d\n",bfs());
}
}
return ;
}
poj2046的更多相关文章
- poj分类 很好很有层次感。
初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. ( ...
- 【转】POJ题目分类推荐 (很好很有层次感)
OJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094)初期: 一. ...
- 【转】ACM训练计划
[转] POJ推荐50题以及ACM训练方案 -- : 转载自 wade_wang 最终编辑 000lzl POJ 推荐50题 第一类 动态规划(至少6题, 和 必做) 和 (可贪心) (稍难) 第二类 ...
- POJ 题目分类(转载)
Log 2016-3-21 网上找的POJ分类,来源已经不清楚了.百度能百度到一大把.贴一份在博客上,鞭策自己刷题,不能偷懒!! 初期: 一.基本算法: (1)枚举. (poj1753,poj2965 ...
- (转)POJ题目分类
初期:一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. ...
- acm常见算法及例题
转自:http://blog.csdn.net/hengjie2009/article/details/7540135 acm常见算法及例题 初期:一.基本算法: (1)枚举. (poj17 ...
- poj分类
初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. ( ...
- 转载 ACM训练计划
leetcode代码 利用堆栈:http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/http://oj.leetcode. ...
- ACM算法总结及刷题参考
参考:http://bbs.byr.cn/#!article/ACM_ICPC/11777 OJ上的一些水题(可用来练手和增加自信)(poj3299,poj2159,poj2739,poj1083,p ...
随机推荐
- 【Shiro】Apache Shiro架构之自定义realm
[Shiro]Apache Shiro架构之身份认证(Authentication) [Shiro]Apache Shiro架构之权限认证(Authorization) [Shiro]Apache S ...
- 一个来自红帽的Java垃圾回收算法,试图把停顿时间降到10毫秒以下 原创 2017-01-10 薛命灯
转自 微信聊聊架构 GC... 早在三年前,Red Hat就启动了Shenandoah项目.Shenandoah是一种新的Java虚拟机GC算法,目标是利用现代多核CPU的优势,减少大堆内存在GC方面 ...
- AssionShop开源B2C电子商务系统-(二)定单流程活动图状态图(转载)
B2C系统的灵魂所在就是定单的流程了,下面展示下定单的最重要的两个动态图,一个是定单流程活动图.还有一个是简单的定单状态图.通过这两张图,基本可以 了解系统定单流的大概情况了啊.图画的只是初步的设想, ...
- 开启ss-libev多用户
原理:通过查看进程,得到命令及需要的参数,然后,在制作一个配置文件,pid文件随意写. 1.首先正常开启一个: /etc/init.d/shadowsocks-libev start 2.然后:利用查 ...
- flink on yarn部分源码解析
转发请注明原创地址:https://www.cnblogs.com/dongxiao-yang/p/9403427.html flink任务的deploy形式有很多种选择,常见的有standalone ...
- CCNA2.0笔记_路由分类
直连路由:当在路由器上配置了接口的IP地址,并且接口状态为up的时候,路由表中就出现直连路由项 静态路由:静态路由是由管理员手工配置的,是单向的. 默认路由:当路由器在路由表中找不到目标网络的路由条目 ...
- Android studio sha1
1.打开android studio 在最下面找到Terminal 如下图 2. 输入命令 C: 进入c盘 3. 输入命令 cd Users\Administrator 其中Adminis ...
- iOS swift 启动页加载广告(图片广告+视频广告)
一般app在启动的时候都会有广告页,广告页用来加载自己的或者第三方的广告,广告的展示形式也多种多样,最近在看swift相关的东西,这里将提供支持加载图片广告和视频广告的解决方案 思路: 我们知道在加载 ...
- 如何在openwrt上实现 U盘的自动挂载
U盘的自动挂载,分为两种场景 1.路由器先上电,然后插上U盘并自动挂载 2.路由器先插上U盘,然后上电并自动挂载 上述场景的实现,需要如下几个步骤: 1.支持如下模块: USB驱动模块:USB OHC ...
- Chrome调试ECMAScript之断点debug技巧大全!
这篇文章主要介绍了使用Chrome调试JavaScript的断点设置和调试技巧,需要的朋友可以参考下 你是怎么调试 JavaScript 程序的?最原始的方法是用 alert() 在页面上打印内容,稍 ...