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),因为它的实现并不是基于 ...
随机推荐
- ■Ascii逐字解码法注入,mysql5.0一下版本手工注入
/*By:珍惜少年时*/ 逐字解码法,不一定非要猜字段内容.库名,表名,字段,data,都能猜. 环境过滤了select.union(mysql5.0以下的版本就不支持union所以也可以用此方法), ...
- string s = null 和 string s = “”的区别
string s = null; 表示一个空串,没有占用了空间,不在内存中开辟空间 string s = "";在内存中开辟空间,但空间中没有值(""也是一个字 ...
- 【leetcode】Palindrome Partitioning II
Palindrome Partitioning II Given a string s, partition s such that every substring of the partition ...
- 12.从上往下遍历二元树[LevelOrderOfBinaryTree]
[题目] 输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印. 例如输入 8 / \ 6 10 /\ /\ 5 7 9 11 输出8 ...
- 那些臭名昭著的sql
两个或多个表关联,没写where条件,大量的笛卡尔值,严重时会导致数据库有问题. select * from a, b left join c on b.id = c.id left join d o ...
- java读取本地properties文件
package cn.edu.hbcf.pojo; import java.io.FileNotFoundException; import java.io.IOException; import j ...
- July 28th, Week 31st Thursday, 2016
Time is a bird flying into eternity. 时间是一只永远在飞翔的鸟儿. Time waits for nobody. Vitality shows in not onl ...
- fedora 添加其他操作系统到 GRUB 2 菜单
# yum install os-prober # grub2-mkconfig -o /boot/grub2/grub.cfg
- Spring源码下载地址
今天想下载一下Spring的源代码,登录到Spring官网,傻眼了,根本找不到下载的地方!费了九牛二虎之力在网上找到了一个下载地址,记下来,免得下次再次傻找. http://s3.amazonaws. ...
- 第六步:Lucene查询索引
package cn.harmel.lucene; import java.io.IOException; import java.nio.file.Paths; import org.apache. ...