BFS+Hash(储存,判重) HDOJ 1067 Gap
题意:一个图按照变成指定的图,问最少操作步数
分析;状态转移简单,主要是在图的存储以及判重问题,原来队列里装二维数组内存也可以,判重用神奇的hash技术
#include <bits/stdc++.h>
using namespace std; const int MOD = 1e6 + 7;
struct Point {
int ch[5][9];
int x[4], y[4];
int step;
};
bool vis[MOD];
int ha; int get_hash(int c[5][9]) {
int tmp[60], k = 0;
for (int i=1; i<=4; ++i) {
for (int j=2; j<=8; ++j) {
tmp[k++] = c[i][j] % 10;
tmp[k++] = c[i][j] / 10;
}
}
int ret = 0;
for (int i=0; i<k; ++i) {
ret = (ret * 7 % MOD + tmp[i]) % MOD;
}
ret = (ret & 0x7fffffff) % MOD;
return ret;
} int init(void) {
int res[5][9];
int x[4] = {11, 21, 31, 41};
for (int i=0; i<4; ++i) {
for (int j=1; j<=7; ++j) {
res[i+1][j] = x[i]++;
}
res[i+1][8] = 0;
}
return get_hash (res);
} void change(Point &v, int x0, int y0, int k) {
int a = v.ch[x0][y0-1] + 1;
for (int i=1; i<=4; ++i) {
for (int j=2; j<=8; ++j) {
if (v.ch[i][j] == a) {
v.x[k] = i; v.y[k] = j;
swap (v.ch[x0][y0], v.ch[i][j]);
return ;
}
}
}
} int BFS(Point &p) {
memset (vis, false, sizeof (vis));
int sh = get_hash (p.ch);
vis[sh] = true;
queue<Point> que; que.push (p);
while (!que.empty ()) {
Point u = que.front (); que.pop ();
int uh = get_hash (u.ch);
if (uh == ha) {
return u.step;
}
for (int i=0; i<4; ++i) {
int x = u.x[i], y = u.y[i];
if (y == 1 || u.ch[x][y] % 10 == 7) continue;
Point v = u;
change (v, x, y, i);
int vh = get_hash (v.ch);
if (vis[vh]) continue;
vis[vh] = true; v.step++;
que.push (v);
}
} return -1;
} int main(void) {
ha = init ();
int T; scanf ("%d", &T);
while (T--) {
Point p; p.step = 0;
for (int i=1; i<=4; ++i) {
p.ch[i][1] = 0;
}
for (int i=1; i<=4; ++i) {
for (int j=2; j<=8; ++j) {
scanf ("%d", &p.ch[i][j]);
}
}
for (int i=1; i<=4; ++i) {
for (int j=2; j<=8; ++j) {
if (p.ch[i][j] == 11) {
swap (p.ch[1][1], p.ch[i][j]);
p.x[0] = i; p.y[0] = j;
}
else if (p.ch[i][j] == 21) {
swap (p.ch[2][1], p.ch[i][j]);
p.x[1] = i; p.y[1] = j;
}
else if (p.ch[i][j] == 31) {
swap (p.ch[3][1], p.ch[i][j]);
p.x[2] = i; p.y[2] = j;
}
else if (p.ch[i][j] == 41) {
swap (p.ch[4][1], p.ch[i][j]);
p.x[3] = i; p.y[3] = j;
}
}
}
int ans = BFS (p);
printf ("%d\n", ans);
} return 0;
}
BFS+Hash(储存,判重) HDOJ 1067 Gap的更多相关文章
- UVA 10651 Pebble Solitaire(bfs + 哈希判重(记忆化搜索?))
Problem A Pebble Solitaire Input: standard input Output: standard output Time Limit: 1 second Pebble ...
- BFS以及hash表判重的应用~
主要还是讲下hash判重的问题吧 这道题目用的是除法求余散列方式 前几天看了下算法导论 由于我们用的是线性再寻址的方式来解决冲突问题 所以hash表的大小(余数的范围)要包含我们要求的范围 对mod的 ...
- 北京网络赛G BOXES 状态压缩+有序BFS+高维数组判重
#include <bits/stdc++.h> using namespace std; ]; ][]; ][][]; ][][][]; ][][][][]; ][][][][][]; ...
- (通俗易懂小白入门)字符串Hash+map判重——暴力且优雅
字符串Hash 今天我们要讲解的是用于处理字符串匹配查重的一个算法,当我们处理一些问题如给出10000个字符串输出其中不同的个数,或者给一个长度100000的字符串,找出其中相同的字符串有多少个(这样 ...
- hdu 4821 字符串hash+map判重 String (长春市赛区I题)
http://acm.hdu.edu.cn/showproblem.php?pid=4821 昨晚卡了非常久,開始TLE,然后优化了之后,由于几个地方变量写混.一直狂WA.搞得我昨晚都失眠了,,. 这 ...
- HDU - 1067 Gap (bfs + hash) [kuangbin带你飞]专题二
题意: 起初定28张卡牌的排列,把其中11, 21, 31, 41移动到第一列,然后就出现四个空白,每个空白可以用它的前面一个数的下一个数填充,例如43后面的空格可以用44填充,但是47后面即 ...
- codevs 1004 四子连棋 BFS、hash判重
004 四子连棋 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋 ...
- 洛谷 P1379 八数码难题 Label:判重&&bfs
特别声明:紫书上抄来的代码,详见P198 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给 ...
- poj 3131 双向搜索+hash判重
题意: 初始状态固定(朝上的全是W,空格位置输入给出),输入初始状态的空格位置,和最终状态朝上的位置,输出要多少步才能移动到,超过30步输出-1. 简析: 每一个格子有6种状态,分别是 0WRB, 1 ...
随机推荐
- August 25th 2016 Week 35th Thursday
Every man dies, but not every man really lives. 每个人都会死,但不是每个人都曾经真真活过. As I become older and older, I ...
- Linear regression with one variable算法实例讲解(绘制图像,cost_Function ,Gradient Desent, 拟合曲线, 轮廓图绘制)_矩阵操作
%测试数据 'ex1data1.txt', 第一列为 population of City in 10,000s, 第二列为 Profit in $10,000s 1 6.1101,17.592 5. ...
- 昨晚把家里的ie升级到11
其实网上有些东西是实用的,不过之前的一次锁屏唤醒机器死机我就强制关机了,昨天把大部分驱动升级.
- jQuery - 5.样式操作
样式操作 1.获取样式 attr("class"), 2.设置样式attr("class","myclass"), 3.追加样式addCla ...
- Delphi面向对象的方法
方法是属于一个给定对象的过程和函数,方法反映的是对象的行为而不是数据,前一篇提到的对象的两个重要的方法:构造方法和析构方法. 为了使对象能执行各种功能,你能在对象中定制方法 创建一个方法用两个步骤,首 ...
- 《图形学》实验四:中点Bresenham算法画直线
开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画直线. 实验结果: 代码: //中点Bresenham算法生成直线 #include <gl/glut.h& ...
- 64位Ubuntu运行32位程序时报文件不存在(No such file or Directory)的一种解决办法
尝试在64位Ubuntu下面运行32位程序时, 一直说 文件不存在(No such file or directory), 我只想说++. 你tm说个文件格式不正确不就好了? 非得说个文件不存在! 真 ...
- tkprof工具详解二(一些实例)
TKPROF是一个可执行文件,自带在Oracle Server软件中,无需额外的安装. 该工具文件可以用来解析ORACLE的SQL TRACE(10046) 以便生成更可读的内容. 实际上tkpro ...
- foreach与Iterable学习
以前对于foreach的使用都是自然而然的感觉,没有深究过为什么可以用,什么时候可以用.最近才发现,原来那些可以使用的类,都是实现了Iterable接口的,否则根本就不能用. 下面是我之前学习时候写的 ...
- Linux下修改默认字符集--->解决Linux下Java程序种中文文件夹file.isDirectory()判断失败的问题
一.问题描述: 一个项目中为了生成树状目录,调用了file.listFiles()方法,然后利用file.isDirectory()方法判断是否为目录,该程序在windows下运行无问题,在Linux ...