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的更多相关文章

  1. DG gap sequence修复一例

    环境:Oracle 11.2.0.4 DG 故障现象: 客户在备库告警日志中发现GAP sequence提示信息: Mon Nov 21 09:53:29 2016 Media Recovery Wa ...

  2. 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 ...

  3. 利用增量备份恢复因归档丢失造成的DG gap

    故障现象:data guard归档出现gap,悲剧的是丢失的归档在主库上被rman备份时删除了,丢失的归档大约有20几个,数据库大小约2T,如果重建DG将非常耗时间,因此决定利用增量备份的方式恢复DG ...

  4. (一)GATT Profile和GAP 简介(目前所有的BLE应用都基于GATT,所以也要了解是怎么一回事)-转发

    个人大总结:(先后顺序) 1.GAP协议定义多个角色(其中就有中心设备[GATT客户端](唯一)叫主设备||和外围设备[GATT服务端端](多个)也叫从设备). 2.先经过GAP协议,再有GATT协议 ...

  5. hdu.1067.Gap(bfs+hash)

    Gap Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  6. 【leetcode】Maximum Gap

    Maximum Gap Given an unsorted array, find the maximum difference between the successive elements in ...

  7. 【leetcode】Maximum Gap(hard)★

    Given an unsorted array, find the maximum difference between the successive elements in its sorted f ...

  8. Datagard產生gap

    本文轉載自無雙的小寶的博客:http://www.cnblogs.com/sopost/archive/2010/09/11/2190085.html 有時候因為網路或備份故障等原因,主機所產生的歸檔 ...

  9. [LintCode] Maximum Gap 求最大间距

    Given an unsorted array, find the maximum difference between the successive elements in its sorted f ...

  10. 线性时间的排序算法--桶排序(以leetcode164. Maximum Gap为例讲解)

    前言 在比较排序的算法中,快速排序的性能最佳,时间复杂度是O(N*logN).因此,在使用比较排序时,时间复杂度的下限就是O(N*logN).而桶排序的时间复杂度是O(N+C),因为它的实现并不是基于 ...

随机推荐

  1. php用soap创建webservice

    php提供了一个专门用于soap操作的扩展库,使用该扩展库后 可以直接在php中进行soap操作.下面将介绍soap的基本操作. 一.soap扩展的使用方法 php的soap扩展库通过soap协议实现 ...

  2. django-cms 代码研究(二)bugs?

    djangocms集成到现有项目中后,发现了几个问题: 1. 现有项目的url匹配失效,下面requests请求被交给djangocms处理了 url(r'^admin/', include(admi ...

  3. SpringMVC请求处理流程

    从web.xml中 servlet的配置开始, 根据servlet拦截的url-parttern,来进行请求转发   Spring MVC工作流程图   图一   图二    Spring工作流程描述 ...

  4. 如何利用phpize在生产环境中为php添加新的扩展php-bcmath

    在日常的开发当中,随着开发的功能越来越复杂.对运行环境的要求也就随着需求的变化需要不断地更新和变化.一个在线的生产系统不可能一开始就满足了所有的运行依赖,因此动态地添加依赖就显得比较必要了.如果你的应 ...

  5. Android 启动画面

    如果你的程序初始化时间过长,那么在初始化之前,程序会现实一个空白的activity页,十分难看. 添加一个启动画面的方法就是为响应的activity加入自定义的Theme,并在theme中设定 and ...

  6. 7.python模块补充

    此文章是对上节文章模块的补充 一,xml模块 xml是实现不同语言或程序之间进行数据交换的协议,可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言.xml的格式如下 ...

  7. java代码获取jdbc链接properties

    public static String getDirPath() { Resource resource = null; Properties props = null; String driver ...

  8. ORACLE恢复删除的数据

    ---正在执行的 select a.username, a.sid,b.SQL_TEXT, b.SQL_FULLTEXT  from v$session a, v$sqlarea b where a. ...

  9. svn 提交冲突(目录下删除文件)

    [root@v01 webtest]# svn ci -m "delete kkk" svn: Commit failed (details follow): svn: Abort ...

  10. Solr学习笔记(一)

    最近准备为一个产品做一个站内的搜索引擎,是一个java产品.由于原来做过Lucene.net,所以自然而然的就想到了使用Lucene.在复习Lucene的过程中发现了Solr这个和Lucene绑定在一 ...