挺好的一道题目,双向bfs的题目,也能单向bfs写。不过双向写的代码太恶心了......还是因为不熟悉

题目大意:给出原密码和准确密码,对于原密码每次可以进行三个操作:
1:任意一位+1 且9+1=1
2:任意一位-1 且1-1=9
3:相邻两位互换,且首位和末位不是相邻的。
(密码只有四位数,每个数字1-9) 题目要求原密码变成准确密码的最少步数

单向bfs:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <climits>//形如INT_MAX一类的
#define MAX 1050
#define INF 0x7FFFFFFF
# define eps 1e-5
//#pragma comment(linker, "/STACK:36777216") ///传说中的外挂
using namespace std;struct node
{int num[4];int step;
}first,last;bool vis[11][11][11][11];bool ok(node t)
{int cnt = 0;for(int i=0; i<4; i++){if(t.num[i] == last.num[i])cnt++;}if(cnt == 4)return 1;return 0;
}void bfs()
{queue<node> q;vis[first.num[0]][first.num[1]][first.num[2]][first.num[3]] = 1;first.step = 0;q.push(first);while(!q.empty()){node tt = q.front();q.pop();node t;if(ok(tt)){cout << tt.step << endl;return ;}for(int i=0; i<4; i++){t = tt;if(t.num[i] == 9)t.num[i] = 1;elset.num[i] ++;t.step = tt.step + 1;if(!vis[t.num[0]][t.num[1]][t.num[2]][t.num[3]]){q.push(t);vis[t.num[0]][t.num[1]][t.num[2]][t.num[3]] = 1;}}for(int i=0; i<4; i++){t = tt;if(t.num[i] == 1)t.num[i] = 9;elset.num[i] --;t.step = tt.step + 1;if(!vis[t.num[0]][t.num[1]][t.num[2]][t.num[3]]){q.push(t);vis[t.num[0]][t.num[1]][t.num[2]][t.num[3]] = 1;}}for(int i=0; i<3; i++){t = tt;swap(t.num[i],t.num[i+1]);t.step = tt.step + 1;if(!vis[t.num[0]][t.num[1]][t.num[2]][t.num[3]]){q.push(t);vis[t.num[0]][t.num[1]][t.num[2]][t.num[3]] = 1;}}}
}int main()
{int t;char s[10],e[10];cin >> t;while(t--){cin >> s >> e;for(int i=0; i<4; i++)first.num[i] = s[i] - '0';for(int i=0; i<4; i++)last.num[i] = e[i] - '0';memset(vis,0,sizeof(vis));bfs();}return 0;
}

双向bfs:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <queue>//#pragma comment(linker, "/STACK:36777216") ///传说中的外挂
using namespace std;struct node
{int num[4];int step;
} first,last;int vis[11][11][11][11];
int vis2[11][11][11][11];bool ok1(node a)
{if(vis[a.num[0]][a.num[1]][a.num[2]][a.num[3]] != -1)return 1;return 0;
}
bool ok2(node a)
{if(vis2[a.num[0]][a.num[1]][a.num[2]][a.num[3]] != -1)return 1;return 0;
}void bfs()
{queue<node>q,q2;memset(vis,-1,sizeof(vis));memset(vis2,-1,sizeof(vis));int tmp1=0,tmp2=0;node t,tt;vis[first.num[0]][first.num[1]][first.num[2]][first.num[3]] = 0;first.step = 0;q.push(first);vis2[last.num[0]][last.num[1]][last.num[2]][last.num[3]] = 0;last.step = 0;q2.push(last);while(1){while(!q.empty() && q.front().step == tmp1){tt = q.front();q.pop();if(ok2(tt)){int k = vis2[tt.num[0]][tt.num[1]][tt.num[2]][tt.num[3]];cout << tt.step + k<< endl;return ;}for(int i=0; i<4; i++){t = tt;if(t.num[i] == 9)t.num[i] = 1;elset.num[i] ++;t.step = tt.step + 1;if(ok2(t)){int k = vis2[t.num[0]][t.num[1]][t.num[2]][t.num[3]];cout << t.step + k<< endl;return ;}if(!ok1(t)){q.push(t);vis[t.num[0]][t.num[1]][t.num[2]][t.num[3]] = t.step;}}for(int i=0; i<4; i++){t = tt;if(t.num[i] == 1)t.num[i] = 9;elset.num[i] --;t.step = tt.step + 1;if(ok2(t)){int k = vis2[t.num[0]][t.num[1]][t.num[2]][t.num[3]];cout << t.step + k<< endl;return ;}if(!ok1(t)){q.push(t);vis[t.num[0]][t.num[1]][t.num[2]][t.num[3]] = t.step;}}for(int i=0; i<3; i++){t = tt;swap(t.num[i],t.num[i+1]);t.step = tt.step + 1;if(ok2(t)){int k = vis2[t.num[0]][t.num[1]][t.num[2]][t.num[3]];cout << t.step + k<< endl;return ;}if(!ok1(t)){q.push(t);vis[t.num[0]][t.num[1]][t.num[2]][t.num[3]] = t.step;}}}tmp1 = q.front().step;//cout << "tmp1" <<' ' << tmp1 << endl;while(!q2.empty() && q2.front().step == tmp2){tt = q2.front();q2.pop();if(ok1(tt)){int k = vis[tt.num[0]][tt.num[1]][tt.num[2]][tt.num[3]];cout << tt.step + k<< endl;return ;}for(int i=0; i<4; i++){t = tt;if(t.num[i] == 9)t.num[i] = 1;elset.num[i] ++;t.step = tt.step + 1;if(ok1(t)){int k = vis[t.num[0]][t.num[1]][t.num[2]][t.num[3]];cout << t.step + k<< endl;return ;}if(!ok2(t)){q2.push(t);vis2[t.num[0]][t.num[1]][t.num[2]][t.num[3]] = t.step;}}for(int i=0; i<4; i++){t = tt;if(t.num[i] == 1)t.num[i] = 9;elset.num[i] --;t.step = tt.step + 1;if(ok1(t)){int k = vis[t.num[0]][t.num[1]][t.num[2]][t.num[3]];cout << t.step + k<< endl;return ;}if(!ok2(t)){q2.push(t);vis2[t.num[0]][t.num[1]][t.num[2]][t.num[3]] = t.step;}}for(int i=0; i<3; i++){t = tt;swap(t.num[i],t.num[i+1]);t.step = tt.step + 1;if(ok1(t)){int k = vis[t.num[0]][t.num[1]][t.num[2]][t.num[3]];cout << t.step + k<< endl;return ;}if(!ok2(t)){q2.push(t);vis2[t.num[0]][t.num[1]][t.num[2]][t.num[3]] = t.step;}}}tmp2 = q2.front().step;}}int main()
{int t;char s[10],e[10];cin >> t;while(t--){cin >> s >> e;for(int i=0; i<4; i++)first.num[i] = s[i] - '0';for(int i=0; i<4; i++)last.num[i] = e[i] - '0';bfs();}return 0;
}

hdu 1195 Open the Lock相关推荐

  1. 杭电OJ分类题目(1)

    原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(1) HDU Introduction HDU ...

  2. HDU-基础搜索总结

    Dfs: 1241 Oil Deposits 题解:https://blog.csdn.net/HeZhiYing_/article/details/81053035 1016 Prime Ring ...

  3. Linux-USB Gadget : Part 4: 最简单的 gadget驱动:g_zero

    Linux-USB Gadget : Part 4: 最简单的 gadget驱动:g_zero 作者: zjujoe 转载请注明出处 Email : zjujoe@yahoo.com BLOG : h ...

  4. HDU 4708 Rotation Lock Puzzle(模拟)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4708 题目大意:给定一个方形矩阵,边长为3-10的奇数.每一圈的数字可以沿着顺时针方向和逆时针方向旋转 ...

  5. hdu 3461 Code Lock(并查集)2010 ACM-ICPC Multi-University Training Contest(3)

    想不到这还可以用并查集解,不过后来证明确实可以-- 题意也有些难理解-- 给你一个锁,这个所由n个字母组成,然后这个锁有m个区间,每次可以对一个区间进行操作,并且区间中的所有字母要同时操作.每次操作可 ...

  6. hdu与poj题目分类

    POJ 初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(po ...

  7. hdu-1195--Open the Lock(BFS)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1195 #include<stdio.h> #include<iostream> ...

  8. 【转载】图论 500题——主要为hdu/poj/zoj

    转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  9. [转] HDU 题目分类

    转载来自:http://www.cppblog.com/acronix/archive/2010/09/24/127536.aspx 分类一: 基础题:1000.1001.1004.1005.1008 ...

最新文章

  1. c语言无限循环while(1)和for(;;)的区别
  2. 【Android】关于Android控件EditText的属性InputType的一些经验
  3. 移动端 IP 优选方案
  4. 淘汰率最高的腾讯产品面试题
  5. C语言及程序设计初步例程-42 将数据输出到文本文件
  6. 《大象UML》看书笔记2:
  7. redux-chunk中间件的安装和使用-(二)
  8. TAOCP_READING 1.1完
  9. 人工智能、大数据、数据挖掘、机器学习-数据集来源
  10. Chrome插件 - FireShot捕捉网页截图(可截取完整页面)
  11. 未安装任何音频输出设备 解决方案
  12. 机器学习入门之异常检测
  13. 大数据Apache Druid(四):使用Imply进行Druid集群搭建
  14. MySQL 内连接、外连接、全连接
  15. MakeItTalk: 让图像开口说话!
  16. Python-使用方法修改字符串的大小写
  17. pyspark- ml-features
  18. Java基础 — JDK和JRE的区别和环境变量配置
  19. epson打印机设置方法
  20. 解决 树莓派ping: baidu.com: 域名解析暂时失败

热门文章

  1. oracle使用表空间语句,oracle表空间语句
  2. 小程序实现分享图片_实现自己的图像识别,基于百度sdk的的图片识别项目
  3. c web mysql数据库_C语言操作MySQL数据库
  4. C++实现分割读取txt文件以及对齐打印设置
  5. 最常用的 Linux 命令汇总,以后总会用到的
  6. qt checkbox 选中事件_Qt学习笔记3(布局管理)
  7. Redis在Java项目中的依赖
  8. php 二进制 十六进制转换,php 实现进制转换(二进制、八进制、十六进制)互相转换实现代码...
  9. java interface作用是什么_Java注解总结:史上最全,有这一篇就够了
  10. 小时光扫地机器人圆圆_小时光:圆圆录像功能已开启,无死角录制林一霸道总裁一面,超甜...