搜索 问题 D: 神奇密码锁
这道题个人认为隐含着状态转换,所以想到的还是BFS,将其中一位数加一或减一或交换临近两位,进入下一状态,使用一个大小为10000的bool数组判重,由于BFS的特性,得到的一定是最小步数;
普通BFS代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
using namespace std;
const int MaxSize = 1e5;
typedef struct node{
int a[4];
int step;
}Node;
Node Q[MaxSize];
bool visit[10005];
bool search_table(int *a){
int tmp=0;
tmp = a[0]*1000+a[1]*100+a[2]*10+a[3];
if(visit[tmp])return false;
visit[tmp] = true;
return true;
}
int BFS(int *start,int *goal){
int head=0,tail=1,tmp;
memset(visit,0,sizeof(visit));
Node t,s;
memcpy(t.a,start,4*sizeof(int));
t.step = 0;
Q[head] = t;
while(head!=tail){
t = Q[head];
if(!memcmp(t.a,goal,4*sizeof(int))) return t.step;
for(int i=0;i<4;i++){
s = t;
s.a[i]++;
s.step++;
if(s.a[i]>9) s.a[i]=1;
if(search_table(s.a)) {
Q[tail]=s;
tail=(tail+1)%MaxSize;
}
}
for(int i=0;i<4;i++){
s = t;
s.a[i]--;
s.step++;
if(s.a[i]<1) s.a[i]=9;
if(search_table(s.a)) {
Q[tail]=s;
tail=(tail+1)%MaxSize;
}
}
for(int i=0;i<3;i++){
s = t;
tmp = s.a[i],s.a[i] = s.a[i+1],s.a[i+1] = tmp;
s.step++;
if(search_table(s.a)) {
Q[tail]=s;
tail=(tail+1)%MaxSize;
}
}
head=(head+1)%MaxSize;
}
return -1;
}
void Input_data(int *start,int *goal){
char c[5];
scanf("%s",c);
for(int i=0;i<4;i++) start[i] = c[i]-'0';
scanf("%s",c);
for(int i=0;i<4;i++) goal[i] = c[i]-'0';
}
int main(){
int T,start[4],goal[4];
scanf("%d",&T);
while(T--){
Input_data(start,goal);
printf("%d\n",BFS(start,goal));
}
}
双向BFS:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int visit[10005];
const int MaxSize = 1e5;
typedef struct node{
int a[4],step;
}Node;
Node start,goal;
int trans(Node x){
int tmp = 0;
for(int i=0;i<4;i++) tmp = tmp*10+x.a[i];
//printf("%d\n",tmp);
return tmp;
}
Node Q1[MaxSize],Q2[MaxSize];
int BFS(){
memset(visit,0,sizeof(visit));
//queue<Node> Q1,Q2;
Node t,s;
int step1=0,step2=0,ans,cnt;
int head1=0,head2=0,tail1=1,tail2=1;
start.step = 0;
goal.step = 0;
Q1[head1] = start;
Q2[head2] = goal;
visit[trans(start)]=1;
visit[trans(goal)]=2;
while(true){
cnt = (tail1-head1+MaxSize)%MaxSize;
while(cnt--){
t = Q1[head1];
if(!memcmp(t.a,goal.a,sizeof(goal.a))) return t.step;
step1 = t.step + 1;
for(int i=0;i<4;i++){
s = t;
s.a[i]++;
if(s.a[i]>9) s.a[i]=1;
ans = trans(s);
if(visit[ans]==2) return step1+step2;
if(!visit[ans]){
visit[ans] = 1;
s.step = step1;
Q1[tail1]=s;
tail1=(tail1+1)%MaxSize;
}
}
for(int i=0;i<4;i++){
s = t;
s.a[i]--;
if(s.a[i]<1) s.a[i]=9;
ans = trans(s);
if(visit[ans]==2) return step1+step2;
if(!visit[ans]){
visit[ans] = 1;
s.step = step1;
Q1[tail1]=s;
tail1=(tail1+1)%MaxSize;
}
}
for(int i=0;i<3;i++){
s = t;
swap(s.a[i],s.a[i+1]);
ans = trans(s);
if(visit[ans]==2) return step1+step2;
if(!visit[ans]){
visit[ans] = 1;
s.step = step1;
Q1[tail1]=s;
tail1=(tail1+1)%MaxSize;
}
}
head1=(head1+1)%MaxSize;
}
cnt = (tail2-head2+MaxSize)%MaxSize;
while(cnt--){
t = Q2[head2];
if(!memcmp(t.a,start.a,sizeof(start.a))) return t.step;
step2 = t.step + 1;
for(int i=0;i<4;i++){
s = t;
s.a[i]++;
if(s.a[i]>9) s.a[i]=1;
ans = trans(s);
if(visit[ans]==1) return step1+step2;
if(!visit[ans]){
visit[ans] = 2;
s.step = step2;
Q2[tail2]=s;
tail2=(tail2+1)%MaxSize;
}
}
for(int i=0;i<4;i++){
s = t;
s.a[i]--;
if(s.a[i]<1) s.a[i]=9;
ans = trans(s);
if(visit[ans]==1) return step1+step2;
if(!visit[ans]){
visit[ans] = 2;
s.step = step2;
Q2[tail2]=s;
tail2=(tail2+1)%MaxSize;
}
}
for(int i=0;i<3;i++){
s = t;
swap(s.a[i],s.a[i+1]);
ans = trans(s);
if(visit[ans]==1) return step1+step2;
if(!visit[ans]){
visit[ans] = 2;
s.step = step2;
Q2[tail2]=s;
tail2=(tail2+1)%MaxSize;
}
}
head2 = (head2+1)%MaxSize;
}
}
}
void Input_and_solve(){
char ch[5];
scanf("%s",ch);
for(int i=0;i<4;i++) start.a[i] = ch[i]-'0';
scanf("%s",ch);
for(int i=0;i<4;i++) goal.a[i] = ch[i]-'0';
printf("%d\n",BFS());
}
int main(){
int T;
scanf("%d",&T);
while(T--){
Input_and_solve();
}
}
//如有错误,还请留言指出
搜索 问题 D: 神奇密码锁的更多相关文章
- 《阿里如何实现秒级百万TPS?搜索离线大数据平台大数据平台架构解读》读后感
在使用淘宝时发现搜索框很神奇,它可以将将我们想要的商品全部查询出来,但是我们并感觉不到数据库查询的过程,速度很快.通过阅读这篇文章让我知道了搜索框背后包含着很多技术,对我以后的学习可能很有借鉴. 平时 ...
- POJ2676Sudoku(类似于八皇后)
Sudoku Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16444 Accepted: 8035 Special ...
- 你所不知道的 URL
0.说明 第一幕 产品:大叔有用户反映账户不能绑定公众号.大叔:啊咧咧?怎么可能,我看看?大叔:恩?这也没问题啊,魏虾米.大叔:还是没问题啊,挖叉类.大叔:T T,话说产品姐姐是不是Java提供接口的 ...
- NOIP练习赛题目3
魔兽争霸 难度级别:C: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 小x正在销魂地玩魔兽他正控制着死亡骑士和n个食尸鬼(编号1-n)去打 ...
- JS代码静态分析及挖掘
JavaScript 已经成为现代 Web 浏览器开发中最普遍的技术之一.使用客户端 JavaScript 框架(如 AngularJS,ReactJS 和 Vue.js)构建的应用程序已向前端输送了 ...
- 【宽度优先搜索】神奇的状态压缩 CodeVs1004四子连棋
一.写在前面 其实这是一道大水题,而且还出在了数据最水的OJ上,所以实际上这题并没有什么难度.博主写这篇blog主要是想写下一个想法--状态压缩.状态压缩在记录.修改状态以及判重去重等方面有着极高的( ...
- [清华集训2017]小 Y 和地铁(神奇思路,搜索,剪枝,树状数组)
世界上最不缺的就是好题. 首先考虑暴搜.(还有什么题是从这东西推到正解的……) 首先单独一个换乘站明显没用,只用考虑一对对的换乘站. 那么有八种情况:(从题解偷图) 然后大力枚举每个换 ...
- UVA - 1631 Locker(密码锁)(dp---记忆化搜索)
题意:有一个n(n<=1000)位密码锁,每位都是0~9,可以循环旋转.每次可以让1~3个相邻数字同时往上或者往下转一格.输入初始状态和终止状态(长度不超过1000),问最少要转几次. 分析: ...
- 总结oninput、onchange与onpropertychange事件的用法和区别 书写搜索的神奇代码
总结oninput.onchange与onpropertychange事件的用法和区别 最近手机开发一个模糊搜索的功能组建,在网上就找到这篇文章! 前端页面开发的很多情况下都需要实时监听文本框输入,比 ...
随机推荐
- app自动化的执行
appium --address 127.0.0.1 --port 10000 --bootstrap-port 10100 --webdriveragent-port 10110 在指定的目录下执行 ...
- 微信点餐系统(七)-微信授权获取openid:
章节小结: 1.学会了微信授权的步骤,学会了微信授权的文档 2.学会了使用natapp内网穿透工具 3.加深了虚拟机的网络配置以及基本使用 4.学会了抓包购票工具fiddler的使用 5.微信授权步骤 ...
- PHP 发邮件《转》
导读:PHP自带的mail()函数,是php内置发邮件的函数,该函数虽然简单,但是要想真正可以发邮件得有很复杂的配置.不适合新手,以及项目实际的应用的开发. php的mail()函数复杂配置,使得直接 ...
- Unity PlayerPrefs 存储的位置
Mac OS 在Mac OS X上PlayerPrefs是存储在~/Library/Preferences文件夹,名为unity.[company name].[product name].plist ...
- sqli-labs(25a)
0X01 看见bind好像是盲注的意思 尝试闭合语句 加入’ 报错 双引号也报错 难道是不许要闭合的? 我们尝试一下 发现过滤了and ?id= and = 那么我们构造 ?id= aandnd = ...
- [CSP-S模拟测试]:最小距离(最短路)
题目传送门(内部题97) 输入格式 第一行三个整数$n,m,p$,第二行$p$个整数$x_1\sim x_p$表示特殊点的编号.接下来$m$行每行三个整数$u,v,w$表示一条连接$u$和$v$,长度 ...
- [CSP-S模拟测试]:123567(莫比乌斯函数+杜教筛+数论分块)
题目传送门(内部题92) 输入格式 一个整数$n$. 输出格式 一个答案$ans$. 样例 样例输入: 样例输出: 数据范围与提示 对于$20\%$的数据,$n\leqslant 10^6$. 对于$ ...
- [HDU4336]:Card Collector(概率DP)
题目传送门 题目描述 夏川的生日就要到了.作为夏川形式上的男朋友,季堂打算给夏川买一些生日礼物.商店里一共有种礼物.夏川每得到一种礼物,就会获得相应喜悦值$W_i$(每种礼物的喜悦值不能重复获得).每 ...
- maven 私服的setting.xml配置
<?xml version="1.0" encoding="UTF-8"?> 2 <settings xmlns="http://m ...
- Django基础之二(URL路由)
URL路由 简介 对于高质量的web应用来说,使用简洁,优雅的URL路由是一个值得尊重的细节,Django可以随心所欲的设计URL,不受框架的约束 为了给一个应用设计URL,你需要一个Python模块 ...