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. django程序报错CSRF verification failed. Request aborted.

    django程序的html页面中form的method='post'的时候报错 Forbidden (403) CSRF verification failed. Request aborted.He ...

  2. ORACLE10G工作原理

    数据库查询语句内部执行过程 Select * from   xxx 步骤 分析阶段(parse) 1.         共享池库高速缓存有没有该语句.如果有直接返回结果. 2.         语法分 ...

  3. 混合高斯模型和EM

    <统计学习方法>这本书上写的太抽象,可参考这位大神的:http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006924.html

  4. Linux init进程详解

    init模块 一般来说,Linux程序只能用另一个Linux程序启动.例如,登录Linux终端程序Mingetty. 但终端程序又由谁启动呢?在计算机上启动Linux时,内核装入并启动init程序. ...

  5. python中import和from...import...的区别

    python中import和from...import...的区别: 只用import时,如import xx,引入的xx是模块名,而不是模块内具体的类.函数.变量等成员,使用该模块的成员时需写成xx ...

  6. centos安装redis及php-redis扩展

    centos安装redis及php-redis扩展  Linux, WEB 七162012 今天公司同事要求在测试机上安装redis,并且要求让php安装上redis的扩展,redis是一个key-v ...

  7. 使用Discuz关键词服务器实现PHP中文分词

    不同于使用自己的服务器进行分词,Discuz!在线中文分词服务是基于API返回分词结果的.在项目中,我们只需要一个函数即可方便地进行分词.关键词提取.以下是根据Discuz!在线分词服务API写的函数 ...

  8. Android app主线程UI更新间歇性崩溃的问题

    对App进行开发测试时,偶尔出现app崩溃的问题.日志如下: 10-25 18:44:52.935 15290-15290/com.zzq.cnblogs E/AndroidRuntime﹕ FATA ...

  9. linux自定义脚本添加到rc.local脚本无法正常运行的问题

    为了能科学地上网,你懂的.其中需要将服务端做成开机启动.然而脚本在secure crt下能正常运行,添加到/etc/rc.local下却无法正常启动服务.用ps查找了下,脚本是运行了,但服务没起来.于 ...

  10. Android activity_main.xml删除边缘距离,充满屏幕

    删除android:paddingBottom.android:paddingLeft.android:paddingRight和android:paddingTop四个属性