HDU1067 Gap
题目:
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.
输入:
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.
输出:
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".
样例:

分析:题意是把任一直接移到空格处为一步;
BFS加hash判重
简单来说hash就是把一个状态用一个数来标识,能一一对应最好(比方说康托展开),这样你就可以方便地知道这个状态有没有走过
1 #include<iostream>
2 #include<sstream>
3 #include<cstdio>
4 #include<cstdlib>
5 #include<string>
6 #include<cstring>
7 #include<algorithm>
8 #include<functional>
9 #include<iomanip>
10 #include<numeric>
11 #include<cmath>
12 #include<queue>
13 #include<vector>
14 #include<set>
15 #include<cctype>
16 #define PI acos(-1.0)
17 const int INF = 0x3f3f3f3f;
18 const int NINF = -INF - 1;
19 typedef long long ll;
20 #define MOD 1000007
21 using namespace std;
22 ll Hash[MOD];
23 struct node
24 {
25 int maze[4][8];
26 int step;//记录步数
27 friend bool operator == (node a, node b)//重载结构体“==”
28 {
29 for (int i = 0; i < 4; ++i)
30 {
31 for (int j = 0; j < 8; ++j)
32 if (a.maze[i][j] != b.maze[i][j]) return false;
33 }
34 return true;
35 }
36 ll gethash()//获取hash值
37 {
38 ll value = 0;
39 for (int i = 0; i < 4; ++i)
40 {
41 for (int j = 0; j < 8; ++j)
42 value += (value<<ll(1)) + (ll)maze[i][j];//随意写
43 }
44 return value;
45 }
46 }st, ed;//起始与结束状态
47 bool verif(ll value)//hash判重函数
48 {
49 int num = value % MOD;//对大质数取余
50 while (Hash[num] != 0 && Hash[num] != value)//处理可能存在的hash冲突
51 {
52 num += 3;//随意写
53 num %= MOD;
54 }
55 if (Hash[num] == 0)
56 {
57 Hash[num] = value;
58 return true;
59 }
60 return false;
61 }
62 void bfs()
63 {
64 queue<node> q;
65 memset(Hash, 0, sizeof(Hash));
66 st.step = 0;
67 q.push(st);
68 verif(st.gethash());
69 while (q.size())
70 {
71 node tmp = q.front();
72 q.pop();
73 for (int i = 0; i < 4; ++i)
74 {
75 for (int j = 0; j < 8; ++j)
76 {
77 if (!tmp.maze[i][j])//寻找空格位置
78 {
79 node cur = tmp;
80 cur.step++;
81 int aim = tmp.maze[i][j - 1] + 1;
82 if (aim == 1 || aim == 8) continue;//空格前为空格或7则跳过
83 int x, y, flag = 0;
84 for (int m = 0; m < 4; ++m)
85 {
86 for (int n = 0; n < 8; ++n)
87 {
88 if (tmp.maze[m][n] == aim)
89 {
90 x = m, y = n;
91 flag = 1;
92 }
93 }
94 }
95 if (flag)
96 {
97 swap(cur.maze[x][y], cur.maze[i][j]);
98 ll value = cur.gethash();
99 //cout << value << endl;
100 if (verif(value))
101 {
102 if (cur == ed)
103 {
104 cout << cur.step << endl;
105 return;
106 }
107 q.push(cur);
108 }
109 }
110 }
111 }
112 }
113 }
114 cout << -1 << endl;
115 }
116 int main()
117 {
118 int T;
119 cin >> T;
120 for (int i = 0; i < 4; ++i)//结束时状态
121 {
122 ed.maze[i][7] = 0;
123 for (int j = 0; j < 7; ++j)
124 ed.maze[i][j] = (i + 1) * 10 + j + 1;
125 }
126 while (T--)
127 {
128 string nul;
129 getline(cin, nul);
130 for (int i = 0; i < 4; ++i)//直接输入时就解决个位数为1的移至行首操作
131 {
132 st.maze[i][0] = (i + 1) * 10 + 1;
133 for (int j = 1; j < 8; ++j)
134 {
135 cin >> st.maze[i][j];
136 if (st.maze[i][j] % 10 == 1) st.maze[i][j] = 0;
137 }
138 }
139 if (st == ed) cout << 0 << endl;
140 else bfs();
141 }
142 return 0;
143 }
HDU1067 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 ...
随机推荐
- c语言实现--双向循环链表操作
1,双向链表相当于两个单向循环链表. 2,双向链表的结点定义. 1 struct DULNode 2 { 3 int data; 4 struct DULNode * prior; 5 struct ...
- hdu2852 KiKi's K-Number
Problem Description For the k-th number, we all should be very familiar with it. Of course,to kiki i ...
- ZYB loves Xor I HDU - 5269 字典树
题意: T组样例,给你n个数.你要找出来这n个数中任意两个数的二进制位中 最低位不同 的位置(假设是k),然后让所有2^k加起来就是结果 什么意思? 例如4 和 2 4的二进制是(100),2的二 ...
- Numpy Quickstart tutorial
此文是关于Numpy的一些基本用法, 内容来源于Numpy官网:https://docs.scipy.org/doc/numpy-dev/user/quickstart.html 1.The Basi ...
- 使用dotNET_Reactor4.7加密后的dll在VS2010中无法打包
1.只要去除加密工具中的反编译选项"Anti ILDASM",再加密就OK了. 2.或者使用VS2008打包也行.
- 网络安全-企业环境渗透2-wordpress任意文件读&&FFmpeg任意文件读
参考 http://prontosil.club/posts/c08799e1/ 一. 实验名称 企业环境渗透2 二. 实验目的 [实验描述] 操作机的操作系统是kali 进入系统后默认是命令行界面 ...
- Bootstrap导航组件
Bootstrap 中的导航组件都依赖同一个 .nav 类,状态类也是共用的.改变修饰类可以改变样式. 标签页 注意 .nav-tabs 类依赖 .nav 基类 <ul class=" ...
- 2021-2-16:请问你知道分布式设计模式中的Quorum思想么?
有效个数(Quorum) 有效个数(Quorum)这个设计模式一般是指分布式系统的每一次修改都要在大多数实例上通过来确定修改通过. 问题背景 在一个分布式存储系统中,用户请求会发到一个实例上.通常在一 ...
- js 检测屏幕分辨率
js 检测屏幕分辨率 class screenChecker { constructor() { this.screen = window.screen; this.fullscreen = fals ...
- 十三香 & 香料
十三香 & 香料 十三香原料组成不完全一致, 但有一些香料却是大家都会采用的: 草蔻.砂仁.肉豆蔻.肉桂.丁香. 花椒.大料.小茴香.木香.白芷. 山萘.良姜和姜 王守义十三香 http:// ...