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 ...
随机推荐
- Grunt快速使用笔记
本篇文章由:http://xinpure.com/grunt-quick-note/ http://www.gruntjs.net/getting-started Grunt中文网 安装 Grunt ...
- Azure Storage Blob 属性设置
概述 在使用SDK做Blob对象属性的获取或设置时,如果只是直接使用get或set方法,是无法成功获取或设置blob对象的属性.主要是因为在获取对象时,对象的属性默认并未被填充到对象,这就需要执行额外 ...
- java基础讲解06-----字符串
1. package test; public class chb01 { public static void main(String[] ggs) { /** ...
- 轻松学,浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI) 依赖注入和控制反转的理解,写的太好了。
轻松学,浅析依赖倒置(DIP).控制反转(IOC)和依赖注入(DI) 2017年07月13日 22:04:39 frank909 阅读数:14269更多 所属专栏: Java 反射基础知识与实战 ...
- XMind--用他来理清自己的思路
背景 一图胜千言,多年以前阅读了<图谋职场>后,深刻体会了这一点.工作学习,有效利用各种图,事半功倍. 简介 XMIND不仅可以绘制思维导图,还能绘制鱼骨图.二维图.树形图.逻辑图.组织结 ...
- GNU Linux高并发性能优化方案
/*********************************************************** * Author : Samson * Date : 07/14/2015 * ...
- Java创建多线程的三种方法
Java多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...
- 反射学习1、反射机制的介绍和基本的API的使用
关于动态语言: 一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”.从这个观点看,Perl,Python,Ruby是动态语言,C+ ...
- python学习之strip()
定义: Python strip() 方法用于移除字符串头尾指定的字符(默认为空格). 语法: str.strip([chars]); 返回值: 返回移除字符串头尾指定的字符生成的新字符串. 例子: ...
- [转]c++ virtual public的含义和作用
我在写基于MICO的CORBA程序的时候遇到的,上网查了一下 转自:http://bbs.seu.edu.cn/pc/pccon.php?id=872&nid=16822 Question:父 ...