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 ...
随机推荐
- SP3267 DQUERY - D-query 莫队板子题
题意可见:https://www.luogu.com.cn/problem/SP3267 可在vj上提交:https://vjudge.net/problem/SPOJ-DQUERY 题意翻译 给出一 ...
- 使用scrapy爬取jian shu文章
settings.py中一些东西的含义可以看一下这里 python的scrapy框架的使用 和xpath的使用 && scrapy中request和response的函数参数 & ...
- Java 窗口 绘制图形 #2
写在前面: 高考结束咧,爽到啊,好耶 完善了Java 窗口 绘制图形 #1里面的程序 加入了缩放平移功能,给代码加了注释 1 package my_package; 2 3 import java.a ...
- Codeforces Round #547 (Div. 3) E. Superhero Battle (数学)
题意:有一个HP为\(h\)的大怪兽,你需要轮流进行\(i\)次操作.每次可以使\(h+=d_i\)(\(d_i\)有正有负),当第\(n\)次操作完成后,再从第一次开始,问能否使得怪兽的HP变为\( ...
- Nginx基础 - 通用优化配置文件
[root@localhost ~]# vim /etc/nginx/nginx.conf user nginx; worker_processes auto; worker_cpu_affinity ...
- 1.搭建NFS环境,用于存储数据
作者 微信:tangy8080 电子邮箱:914661180@qq.com 更新时间:2019-06-12 14:59:50 星期三 欢迎您订阅和分享我的订阅号,订阅号内会不定期分享一些我自己学习过程 ...
- VMware虚拟化与Kubernetes(K8s)类比阐述-适合VMware用户
概述 容器技术是最近几年非常热门的技术,它似乎就是为云端的应用量身定制的,所以它也被贴上了云原生应用 (Cloud Native Application) 技术的标签.目前最为流行的容器管理调度平台是 ...
- C++ part6.5
1.虚函数表建立和虚函数表指针初始化 虚拟函数表是在编译期就建立了,各个虚拟函数这时被组织成了一个虚拟函数的入口地址的数组.而虚函数表指针是在运行期,也就是构造函数被调用时进行初始化的,这是实现多态的 ...
- 计蒜客 2019南昌邀请网络赛J Distance on the tree(主席树)题解
题意:给出一棵树,给出每条边的权值,现在给出m个询问,要你每次输出u~v的最短路径中,边权 <= k 的边有几条 思路:当时网络赛的时候没学过主席树,现在补上.先树上建主席树,然后把边权交给子节 ...
- Ubuntu-16.04下Docker通过阿里云镜像安装(apt-get)
由于通过官方路径安装docker时总是连接不上,所以从网上找了半天,通过阿里云镜像安装docker,我的Linux是ubuntu-16.04 一.配置源里的阿里云镜像仓库 sudo vim /etc/ ...