poj 3131 Cubic Eight-Puzzle 双向广搜 Hash判重

挺不错的题目,很锻炼代码能力和调试能力~

题意:初始格子状态固定,给你移动后格子的状态,问最少需要多少步能到达,如果步数大于30,输出-1。


由于单向搜索状态太多,搜到二十几就会爆了,所以应该想到双向广搜。

对于每一个格子,我只需要记录上面和前面的格子颜色,因为格子左右移动前面颜色不变上面颜色变了,前后移动的话只是前面和上面的颜色交换了而已,不过写的太挫了。。。应该直接进制压缩一下。。。我还用了两个数来表示前面和上面的颜色,下次把这些搜索题全A了后再回来重新写一下,重写效果也会不错,并不是题目a了这题就好了。


 

#include <stdio.h>
#include <string.h>#define LL __int64const int mod = 100007;
struct HASH{int head[mod+10], E, next[222222];int v1[222222], v2[222222], c[222222];void init() {memset(head, -1, sizeof(head));E = 0;}int gethash(int x,int y) {return (((LL)x + y)%mod+mod)%mod;}int isin(int x, int y) {int u = gethash(x, y);for(int i = head[u];i != -1;i = next[i]) {if(v1[i] == x && v2[i] == y) return c[i];}return -1;}void push(int x, int y, int step) {int u = gethash(x, y);v1[E] = x;v2[E] = y;c[E] = step;next[E] = head[u];head[u] = E++;}
}ha1, ha2;struct PP{int st1, st2;int step;PP(){}PP(int st1, int st2, int step) : st1(st1), st2(st2), step(step) {}
}cur, to, q[1000002];int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, 1, -1};
int a[22], b[22], d[2222];void swap(int &a, int &b) {int t = a; a = b; b = t;
}void get_zt(int st1, int st2) {for(int i = 9;i >= 1;i --)  a[i] = st1%10, st1 /= 10;for(int i = 9;i >= 1;i --)  b[i] = st2%10, st2 /= 10;
}void get_xy(int &st1, int &st2) {st1 = st2 = 0;for(int i = 1;i <= 9; i++)  st1 = st1*10+a[i];for(int i = 1;i <= 9; i++)  st2 = st2*10+b[i];
}bool judge(int go) {int ret = 0;for(int i = 1;i <= 9; i++)  ret = ret*10+a[i];return go == ret;
}int getnew(int a, int b) {int vis[5], i;for(i = 1;i <= 3; i++) vis[i] = 0;vis[a]++;vis[b]++;for(i = 1;i <= 3; i++)  if(!vis[i]) return i;
}int min(int a, int b) {return a>b?b:a;
}int bfs(int st1,int st2, int go) {ha1.init();ha1.push(st1, st2, 0);int head = 0, tail = 0;q[tail++] = PP(st1, st2, 0);int i, j, k;while(head < tail) {cur = q[head++];st1 = cur.st1, st2 = cur.st2;get_zt(st1, st2);int now ;for(i = 1;i <= 9; i++)  if(a[i] == 4) {now = i; break;}int x = now/3+1, y = now%3;if(y == 0)  y = 3, x--;for(i = 0;i < 4; i++) {int xx = x+dx[i];int yy = y+dy[i];if(xx < 1 || xx > 3 || yy < 1 || yy > 3)    continue;int then = (xx-1)*3+yy;swap(a[now], a[then]);swap(b[now], b[then]);if(i < 2) {swap(a[now], b[now]);if(judge(go)) {return cur.step+1;}get_xy(to.st1, to.st2);to.step = cur.step+1;if(ha1.isin(to.st1, to.st2) == -1 && to.step <= 20) {ha1.push(to.st1, to.st2, to.step);if(to.step > 20)   continue;q[tail++] = to;}swap(a[now], b[now]);}else {a[now] = getnew(a[now], b[now]);if(judge(go)) {return cur.step+1;}get_xy(to.st1, to.st2);to.step = cur.step+1;if(ha1.isin(to.st1, to.st2) == -1 && to.step <= 20) {ha1.push(to.st1, to.st2, to.step);if(to.step > 20)   continue;q[tail++] = to;}a[now] = getnew(a[now], b[now]);}swap(a[now], a[then]);swap(b[now], b[then]);}}int temp , tot = 0;int N = 1<<8;for(i = 0;i < N; i++) {temp = go;for(j = 9;j >= 1; j--)a[j] = temp%10 , temp /= 10;int id1 = 1, id2 = 0, sum = 0;while(id1 <= 9) {if(a[id1] == 4) {sum = sum*10+4;id1++;continue;}if((1<<id2) & i) {for(k = 3;k >= 1; k--)   if(k != a[id1])    break;sum = sum*10+k;}else {for(k = 1;k <= 3; k++)   if(k != a[id1])    break;sum = sum*10+k;}id1++, id2++;}d[tot++] = sum;}for(i = 0;i < tot; i++){int now = ha1.isin(go, d[i]);if(now >= 0)    return now;}int ans = 1111111;for(int ii = 0;ii < tot;ii++) {ha2.init();cur = PP(go, d[ii], 0);int head = 0, tail = 0;q[tail++] = cur;int ok = 0;while(head < tail) {cur = q[head++];st1 = cur.st1, st2 = cur.st2;get_zt(st1, st2);int now ;for(i = 1;i <= 9; i++)  if(a[i] == 4) {now = i; break;}int x = now/3+1, y = now%3;if(y == 0)  y = 3, x--;for(i = 0;i < 4; i++) {int xx = x+dx[i];int yy = y+dy[i];if(xx < 1 || xx > 3 || yy < 1 || yy > 3)    continue;int then = (xx-1)*3+yy;swap(a[now], a[then]);swap(b[now], b[then]);if(i < 2) {swap(a[now], b[now]);get_xy(to.st1, to.st2);to.step = cur.step+1;int temp = ha1.isin(to.st1, to.st2);if(temp >= 0)  {ok = 1;ans = min(ans, temp+to.step);continue;}if(ha2.isin(to.st1, to.st2) == -1 && to.step <= 10) {ha2.push(to.st1, to.st2, to.step);q[tail++] = to;}swap(a[now], b[now]);}else {a[now] = getnew(a[now], b[now]);get_xy(to.st1, to.st2);to.step = cur.step+1;int temp = ha1.isin(to.st1, to.st2);if(temp >= 0)  {ok = 1;ans = min(ans, temp+to.step);continue;}if(ha2.isin(to.st1, to.st2) == -1 && to.step <= 10) {ha2.push(to.st1, to.st2, to.step);q[tail++] = to;}a[now] = getnew(a[now], b[now]);}swap(a[now], a[then]);swap(b[now], b[then]);if(ok)  break;}if(ok)  break;}}if(ans > 30)  return -1;return ans;
}int main() {int i, x, n, m;while(scanf("%d%d", &m, &n) != -1 && n) {int go = 0, st1 = 0, st2 = 0;char ch[2];for(i = 1;i <= 9; i++) {scanf("%s", ch);if(ch[0] == 'W') x = 1;else if(ch[0] == 'R')    x = 2;else if(ch[0] == 'B')    x = 3;else    x = 4;go = go*10 + x;if(i == (n-1)*3 + m) {st1 = st1*10+4;st2 = st2*10+4;}else  {st1 = st1*10+1;st2 = st2*10+2;}}if(st1 == go) {puts("0"); continue;}printf("%d\n", bfs(st1, st2, go));}return 0;
}


 


 

转载于:https://www.cnblogs.com/pangblog/p/3239133.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575827.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 优化rand_mysql优化--巧用rand(),with rollup,help__update2014.1.13

巧用rand()提取随机行&#xff1a;mysql中rand()获取0-1之间的一个随机数.这个函数和order by能把数据随机排序。随机从表中取出十条数据:select * from tablename order by rand() limit 10;此方法确实很方便&#xff0c;但是效率上却慢的惊人&#xff0c;切勿使用。SELECT * …

server2003 IIS 错误 解决

网页无法打开总显示&#xff1a;无法找到该页您正在搜索的页面可能已经删除、更名或暂时不可用。 --------------------------------------------------------------------------------请尝试以下操作&#xff1a;确保浏览器的地址栏中显示的网站地址的拼写和格式正确无误。 如…

mysql web备份软件_GitHub - toolzone/mysql_web_backup: mysql数据库自动备份,web网站自动备份shell脚本...

注意&#xff1a;Mysql_backup.sh 为 mysql 自动备份 脚本&#xff0c;配合 crontab命令 用来管理需要周期性执行任务Web_backup.sh 为 web文件 自动备份 脚本&#xff0c;配合 crontab命令 用来管理需要周期性执行任务Mysql_backup.sh 里&#xff1a;* 把 username 替换为mysq…

快速下载助手1.1--添加断点下载

在上一章中实现了多线程的断点下载&#xff0c;将快速下载助手添加断点下载功能&#xff0c;明天实现了速率统计功能 效果图如下&#xff1a; 打印信息如下&#xff1a; 欢迎使用快速下载助手-->并不是线程多就下载的快! 文件夹已经存在 默认的线程个数&#xff1a;3 保存路…

mysql查询自定义数据_实现自定义查询的数据库设计及实现(一)

需求先说一下需求&#xff1a;实现用户自定义的查询&#xff0c;用户可以自定义要查询的列、自定义条件条件、自定义排序。除了查询使用外&#xff0c;还可以使用于各个需要根据条件进行约束的业务&#xff0c;如权限&#xff1b;本设计和实现&#xff0c;很大部分是通过数据库…

poj 1321 棋盘问题

题目&#xff1a; http://poj.org/problem?id1321 八皇后问题&#xff0c;用dfsj即可。 源代码&#xff1a; 1 #include <iostream>2 #include<stdio.h>3 #include<cstring>4 using namespace std;5 int a[10][10];6 int visit[10];7 int n,k,sum;8 __int64…

php mysql-proxy报错_MySQL-proxy代理导致PHP PDO::ATTR_EMULATE_PREPARES的预处理出错,MySQL报General error: 1243错误...

背景&#xff1a;用的ThinkPHP5的框架。(相比之前的3.2版本&#xff0c;版本5都用了PDO处理数据库)症状&#xff1a;SQLSTATE[HY000]: General error: 1243 Unknown prepared statement handler (1) given to mysqld_stmt_execute具体的错误SQL&#xff0c;可能是任何一条正常的…

异步分页ajax

****jsp页面代码 <% page language"java" pageEncoding"utf-8"%> <% taglib prefix"s" uri"/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.or…

python函数模块_06.Python函数和模块

函数基础目标函数的快速体验函数的基本使用函数的参数函数的返回值函数的嵌套调用在模块中定义函数函数的快速体验1.1 快速体验所谓函数&#xff0c;就是把 具有独立功能的代码块 组织为一个小模块&#xff0c;在需要的时候 调用函数的使用包含两个步骤&#xff1a;定义函数 —…

浙江大学PAT上机题解析之1008. 数组元素循环右移问题 (20)

1008. 数组元素循环右移问题 (20) 时间限制 400 ms内存限制 32000 kB代码长度限制 8000 B判题程序 Standard一个数组A中存有N&#xff08;N>0&#xff09;个整数&#xff0c;在不允许使用另外数组的前提下&#xff0c;将每个整数循环向右移M&#xff08;M>0&#x…

mysql11导入数据_MySQL专题11之MySQL导出数据、MySQL导入数据

1、MySQL导出数据- MySQL中你可以使用SELECT...INTO OUTFILE语句来简单的导出数据到文本文件中。a、使用SELECT...INTO OUTFILE- 以下实例中我们将数据库runoob_tbl数据导出到/tmp/tutorials.txt文件中&#xff1a;mysql> SELECT * FROM runoob_tbl-> INTO OUTFILE /tm…

向量叉乘判断两向量之间是顺时针还是逆时针

转自http://blog.163.com/shiliping_007/blog/static/25772011201071744031933/ 向量积 a x b (^n) * |a| * |b| * sin<a, b>, 其中^n是同时垂直于a/b且符合右手定则的单位向量。若已知向量a (ax, ay, az), b (bx, by, bz); 则 a x b (ay * bz - by * az, az * bx - …

java 生成随机数_Java 生成随机数的 N 种方法

原标题&#xff1a;Java 生成随机数的 N 种方法www.baeldung.com/java-generating-random-numbers1.引言本文将探讨用 Java 生成随机数的不同方法。2.Java APIJava API 提供了几种随机数生成方法。让我们一起来了解一下。2.1.java.lang.MathMath 类中的 random 方法返回一个 [0…

剑指offer--面试题13

题目&#xff1a;以O(1)的时间复杂度删除单链表中的某个节点 自己所写代码如下&#xff1a; //以O(1)时间删除链表节点 //要求&#xff1a;单向链表&#xff0c;头指针&#xff0c;待删节点指针//链表节点 struct ListNode {int m_nValue;ListNode* m_pNext; }; //O(n)的解法&a…

重启java_让Java程序自动重启的实现方法(推荐)

要让一个java程序自动重启还真不容易的&#xff0c;重启分两步&#xff0c;首先是结束程序&#xff0c;这个简单&#xff0c;只要运行System.exit()就可以了。然后是启动&#xff0c;这个就难了&#xff0c;这个时候程序都已经结束了&#xff0c;就像一个人死了就不可能再自己站…

【HDOJ】4602 Partition

【题目】http://acm.hdu.edu.cn/showproblem.php?pid4602 【报告】 直接贴上标程解题报告&#xff1a;&#xff08;虽然有些纠结&#xff0c;试一下就弄通了。。&#xff09; Problem C. Partition 我们可以特判出n< k的情况。 对于1< k&#xff0c;我们可以等效为n个点…

json 字符串 java_Java中string字符串转json对象方法

Java中string字符串转json对象方法Java利用JSONObject进行string字符串转换成JSON对象转换实例一public class StringToJSON {public static void main(String[] args) throws JSONException{System.out.println("abc");//定义JSON字符串String jsonStr "{\&qu…

poj 3026 Borg Maze (最小生成树+bfs)

有几个错误&#xff0c;调试了几个小时&#xff0c;样例过后 1Y. 题目&#xff1a;http://poj.org/problem?id3026 题意&#xff1a;就是让求A们和S的最小生成树 先用bfs找每两点的距离&#xff0c;再建树。没剪枝 63MS。 1 #include <iostream>2 #include<cstdio&g…

webview 调用java_Android中在WebView里实现Javascript调用Java类的方法

为了方便网页和Android应用的交互&#xff0c;Android系统提供了WebView中JavaScript网页脚本调用Java类方法的机制。只要调用addJavascriptInterface方法即可映射一个Java对象到JavaScript对象上。1、映射Java对象到JavaScript对象上mWebView (WebView) findViewById(R.id.wv…

VS的一部分快捷键

快捷键 功能CTRL SHIFT B 生成解决方案CTRL F7 生成编译CTRL O 打开文件CTRL SHIFT O 打开项目…