Gap
Gap
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 435 Accepted Submission(s): 242
Problem Description
Let's play a card game called Gap.
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
The input starts with a line containing the number of initial layouts that follow.
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
For each initial layout, produce a line with the minimum number of moves to reach the goal layout. Note that this number should not include the initial four moves of the cards of value 1. If there is no move sequence from the initial layout to the goal layout, produce "-1".
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
Asia 2003(Aizu Japan)
Recommend
JGShining
一看题就觉得是bfs,结果怎么也写不出来,再看别人的代码原来是是bfs+hash
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#define maxprime 1000007
struct gaptree{
int map[][];
int x[],y[],step;
__int64 getall()
{
__int64 sum=;
for(int i=;i<;i++)
for(int j=;j<;j++)
sum=(sum<<)+map[i][j];
return sum;
}
bool operator == (gaptree aim )const
{
for(int i=;i<;i++)
for(int j=;j<=;j++)
if(map[i][j]!=aim.map[i][j]) return false;
return true;
}
};
__int64 hash[maxprime];
gaptree start ,end;
__int64 startval,endval;int minstep;
#define inf 0x4f4f4f4f
void init()
{
int temp,ten,i,j;
memset(hash,-,sizeof(hash));//初始化为没有访问
for(i=;i<;i++)
start.map[i][]=(i+)*+;
for(i=;i<;i++)
for(j=;j<=;j++)
{
scanf("%d",&temp);
if((temp==)||(temp==)||(temp==)||(temp==))
{
ten=(temp/)%-;
start.x[ten]=i;
start.y[ten]=j;
start.map[i][j]=;
}
else start.map[i][j]=temp;
}
start.step=;
for(i=;i<;i++)
{
for(j=;j<=;j++) end.map[i][j]=(i+)*+j+;
end.map[i][j]=; }
startval=start.getall();
endval=end.getall();
}
bool hashjudge(__int64 val)
{
val=val%maxprime;
while(hash[val]!=-&&hash[val]!=val)
{
val+=;
val=val%maxprime;
}
if(hash[val]==-)
{
hash[val]=val ;
return true;
}
return false ;
}
int bfs()
{
queue<gaptree > q;
int i,tempnum,tempx,tempy,j,k;
bool flag;
while(!q.empty())
q.pop();
gaptree p,temp;
p=start;
if(startval==endval)
{ return ;
}
hashjudge(startval);
q.push(start);
while(!q.empty())
{
temp=q.front();
q.pop();
if(temp.getall()==endval)
{
return temp.step;
}
for(i=;i<;i++)
{
p=temp;
tempnum=p.map[p.x[i]][p.y[i]-];
if((tempnum%)==)
continue;
flag=true;
tempnum++;
for(j=;j<&&flag;j++)
for(k=;k<=&&flag;k++)
if(p.map[j][k]==tempnum)
{ tempx=j;
tempy=k;
flag=false;
}
if(!flag)
{
p.map[tempx][tempy]=;
p.map[p.x[i]][p.y[i]]=tempnum;
p.x[i]=tempx;p.y[i]=tempy;
p.step=temp.step+;
if(hashjudge(p.getall())) q.push(p);
}
}
}
return -;
}
int main()
{
int tcase;
scanf("%d",&tcase);
while(tcase--)
{
init();
minstep=bfs();
printf("%d\n",minstep);
}
return ;
}
Gap的更多相关文章
- DG gap sequence修复一例
环境:Oracle 11.2.0.4 DG 故障现象: 客户在备库告警日志中发现GAP sequence提示信息: Mon Nov 21 09:53:29 2016 Media Recovery Wa ...
- 16 On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima 1609.04836v1
Nitish Shirish Keskar, Dheevatsa Mudigere, Jorge Nocedal, Mikhail Smelyanskiy, Ping Tak Peter Tang N ...
- 利用增量备份恢复因归档丢失造成的DG gap
故障现象:data guard归档出现gap,悲剧的是丢失的归档在主库上被rman备份时删除了,丢失的归档大约有20几个,数据库大小约2T,如果重建DG将非常耗时间,因此决定利用增量备份的方式恢复DG ...
- (一)GATT Profile和GAP 简介(目前所有的BLE应用都基于GATT,所以也要了解是怎么一回事)-转发
个人大总结:(先后顺序) 1.GAP协议定义多个角色(其中就有中心设备[GATT客户端](唯一)叫主设备||和外围设备[GATT服务端端](多个)也叫从设备). 2.先经过GAP协议,再有GATT协议 ...
- hdu.1067.Gap(bfs+hash)
Gap Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- 【leetcode】Maximum Gap
Maximum Gap Given an unsorted array, find the maximum difference between the successive elements in ...
- 【leetcode】Maximum Gap(hard)★
Given an unsorted array, find the maximum difference between the successive elements in its sorted f ...
- Datagard產生gap
本文轉載自無雙的小寶的博客:http://www.cnblogs.com/sopost/archive/2010/09/11/2190085.html 有時候因為網路或備份故障等原因,主機所產生的歸檔 ...
- [LintCode] Maximum Gap 求最大间距
Given an unsorted array, find the maximum difference between the successive elements in its sorted f ...
- 线性时间的排序算法--桶排序(以leetcode164. Maximum Gap为例讲解)
前言 在比较排序的算法中,快速排序的性能最佳,时间复杂度是O(N*logN).因此,在使用比较排序时,时间复杂度的下限就是O(N*logN).而桶排序的时间复杂度是O(N+C),因为它的实现并不是基于 ...
随机推荐
- pure MVC框架目标与好处
框架一瞥 PureMVC是一个为创建基于经典MVC元设计模式应用的轻量级框架. 此框架是开源且免费的,已经被AS2,AS3,Java,C#以及其他流行语言所实现.这也允许在多样的平台上开发,包括: l ...
- 修改 ~/.bashrc显示 git 当前分支
vim ~/.bashrc # git branch show configuration PS1="\\w:\$(git branch 2>/dev/null | grep '^*' ...
- bwa的使用方法
bwa的使用需要两中输入文件: Reference genome data(fasta格式 .fa, .fasta, .fna) Short reads data (fastaq格式 .f ...
- mysql将int 时间类型格式化
摘要 DATE_FORMAT(date,format) 根据format字符串安排date值的格式. DATE_FORMAT(date,format) 根据format字符串安排date值的格式. ...
- ASP.NET MVC 入门系列教程
ASP.NET MVC 入门系列教程 博客园ASP.NET MVC 技术专题 http://kb.cnblogs.com/zt/mvc/ 一个居于ASP.NET MVC Beta的系列入门文章,有朋友 ...
- 《转》常用Petri网模拟软件工具简介
本文转载自liusj2003,如给您带来不便之处,请联系博主. 首先要介绍的的一个非常有名的Petri 网网站--Petri Nets World: http://www.informatik.uni ...
- Sharepoint 2010 创建栏 计算栏
SharePoint 创建栏时,可以添加计算字段, 网上查了查,相关资料如下: http://wenku.baidu.com/view/936239e9b8f67c1cfad6b88f.html ht ...
- PYTHON实现HTTP摘要认证(DIGEST AUTHENTICATION)
参考: http://blog.csdn.net/kiwi_coder/article/details/28677651 http://blog.csdn.net/gl1987807/article/ ...
- hdu3555
基本的数位dp #include <cstdio> #include <cstring> using namespace std; #define D(x) x ; long ...
- iOS 中constraint 不等于约束和低优先级约束使用的简单体会
看了些文章发现,在使用constraint时,不等于约束往往是和低优先级约束成对使用的,这样才能实现他们的效果. 看看例子 下面是在3.5存屏幕下的效果 图1,竖屏,在满足>=50的前提下,可以 ...