HDU 1195 Open the Lock (双宽搜索)
意甲冠军:给你一个初始4数字和目标4数字,当被问及最初的目标转换为数字后,。
变换规则:每一个数字能够加1(9+1=1)或减1(1-1=9),或交换相邻的数字(最左和最右不是相邻的)。
双向广搜:分别对初始和目标数字进行广搜,vis数组用1和2标记两种已搜索的数字,用mp数组记录状态的步数。
当从前往后搜能够到达2或从后往前搜能够到达1状态则就能够了。。。
#include<stdio.h>
#include<string.h>
#include<string>
#include<queue>
#include<map>
#include<iostream>
#include<algorithm>
using namespace std; struct node
{
int a[4];
int step;
}s,e;
int vis[10001];//标记当前状态是否有走过(从前往后走为1,从后往前走为2。没有走过为0)
int mp[10001];//标记走到当前状态的步数
int get_num(int c[])
{
int n=0;
for(int i=0;i<4;i++)
{
n*=10;
n+=c[i];
}
return n;
}
int bfs()
{
memset(vis,0,sizeof(vis));
memset(mp,0,sizeof(mp));
queue<node>p,q;
int tmp;
tmp=get_num(s.a);
vis[tmp]=1;
tmp=get_num(e.a);
vis[tmp]=2; node u,v;
p.push(s);
q.push(e);
while(!q.empty()||!p.empty())
{
if(!p.empty())
{
u=p.front();
p.pop();
for(int i=0;i<4;i++)
{
v=u;
v.a[i]=u.a[i]+1;//+1
if(v.a[i]==10)
v.a[i]=1;
tmp=get_num(v.a);
if(vis[tmp]==0)//从前往后没有走过
{
v.step=u.step+1;
mp[tmp]=v.step;//标记走到当前状态的步数
vis[tmp]=1;
p.push(v);
}
else if(vis[tmp]==2)//从前往后与从后往前有交叉
return u.step+mp[tmp]+1;
v.a[i]=u.a[i]-1;//-1
if(v.a[i]==0)
v.a[i]=9;
tmp=get_num(v.a);
if(vis[tmp]==0)
{
v.step=u.step+1;
mp[tmp]=v.step;
vis[tmp]=1;
p.push(v);
}
else if(vis[tmp]==2)
return u.step+mp[tmp]+1;
}
for(int i=0;i<3;i++)//交换
{
v=u;
int k=v.a[i];
v.a[i]=v.a[i+1];
v.a[i+1]=k;
tmp=get_num(v.a);
if(vis[tmp]==0)
{
v.step=u.step+1;
mp[tmp]=v.step;
vis[tmp]=1;
p.push(v);
}
else if(vis[tmp]==2)
return u.step+mp[tmp]+1;
} }
if(!q.empty())
{
u=q.front();
q.pop();
for(int i=0;i<4;i++)
{
v=u;
v.a[i]=u.a[i]+1;
if(v.a[i]==10)
v.a[i]=1;
tmp=get_num(v.a);
if(vis[tmp]==0)
{
v.step=u.step+1;
mp[tmp]=v.step;
vis[tmp]=2;
q.push(v);
}
else if(vis[tmp]==1)//从后往前与从前往后哟交叉
return u.step+mp[tmp]+1; v.a[i]=u.a[i]-1;
if(v.a[i]==0)
v.a[i]=9;
tmp=get_num(v.a);
if(vis[tmp]==0)
{
v.step=u.step+1;
mp[tmp]=v.step;
vis[tmp]=2;
q.push(v);
}
else if(vis[tmp]==1)
return u.step+mp[tmp]+1;
}
for(int i=0;i<3;i++)
{
v=u;
int k=v.a[i];
v.a[i]=v.a[i+1];
v.a[i+1]=k;
tmp=get_num(v.a);
if(vis[tmp]==0)
{
v.step=u.step+1;
mp[tmp]=v.step;
vis[tmp]=2;
q.push(v);
}
else if(vis[tmp]==1)
return u.step+mp[tmp]+1;
}
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
char s1[10],s2[10];
scanf("%s%s",s1,s2);
for(int i=0;i<4;i++)
s.a[i]=s1[i]-'0';
for(int i=0;i<4;i++)
e.a[i]=s2[i]-'0';
s.step=0;
e.step=0;
printf("%d\n",bfs());
}
return 0;
}
/*
99
1221
1212
*/
版权声明:本文博客原创文章。博客,未经同意,不得转载。
HDU 1195 Open the Lock (双宽搜索)的更多相关文章
- hdu 1195 Open the Lock
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1195 Open the Lock Description Now an emergent task f ...
- hdu - 1195 Open the Lock (bfs) && hdu 1973 Prime Path (bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1195 这道题虽然只是从四个数到四个数,但是状态很多,开始一直不知道怎么下手,关键就是如何划分这些状态,确保每一个 ...
- hdu 1195:Open the Lock(暴力BFS广搜)
Open the Lock Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- hdu 1195 Open the Lock(广搜,简单)
题目 猜密码,问最少操作多少次猜对,思路很简单的广搜,各种可能一个个列出来就可以了,可惜我写的很搓. 不过还是很开心,今天第一个一次过了的代码 #define _CRT_SECURE_NO_WARNI ...
- hdu 1195 Open the Lock (BFS)
Open the Lock Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- hdu 4778 Gems Fight! 博弈+状态dp+搜索
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4102743.html 题目链接:hdu 4778 Gems Fight! 博弈+状态dp+搜 ...
- HDU 3131 One…Two…Five! (暴力搜索)
题目链接:pid=3131">HDU 3131 One-Two-Five! (暴力搜索) 题意:给出一串数字,要求用加,减,乘,除(5/2=2)连接(计算无优先级:5+3*6=8*6= ...
- hdu 1401(单广各种卡的搜索题||双广秒速)
Solitaire Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- hdu 1195(搜索)
Open the Lock Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
随机推荐
- Unable to start MySQL service. Another MySQL daemon is already running with the same UNIX socket
Unable to start MySQL service. Another MySQL daemon is already running with the same UNIX socket 特征 ...
- 高速幂 POW优化
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h&g ...
- Java重命名文件
File file = new File("D:\\aa\a.txt"); file.renameTo(new File("D:\\aa\\b.txt" ...
- coco2dx c++ HTTP实现
coco2dx c++ HTTP实现 达到的结果如下面的 iPhone截图 android 日志截图 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdnBp ...
- slider使用TickPlacement获得游标效果
<Slider Name="slider游标效果" Maximum="3" SmallChange="0.25" TickPlacem ...
- ASM时的OFM特性对影的建数据文件名称的影响及为SYSTEM表空间的数据文件使用别名
客户遇到个DG的问题,存储使用的ASM管理,有多个磁盘盘. 在主库创建数据文件,备库自己主动创建的数据文件都在同一磁盘组,而且在主库创建数据文件是指定的是类似**.DBF的名字,到备库也变成了使用AS ...
- SQL Server,Access数据库查询易混点和C#中parameter指定参数长度的优缺点
在学校的时候就经常做一些网站,所以这次在公司实习,组长第一次给了一个企业的网站还是很快的完成了.中间并没有遇到什么大的问题,但是还是遇到了两个新手非常容易混淆的小问题,所以拿出来跟大家分享一下. 主要 ...
- 使用NSCondition实现多线程同步
iOS中实现多线程技术有非常多方法. 这里说说使用NSCondition实现多线程同步的问题,也就是解决生产者消费者问题(如收发同步等等). 问题流程例如以下: 消费者取得锁,取产品,假设没有,则wa ...
- swift笔记 (三) —— 字符和字符串
字符串和字符 苹果要是不提供了unicode的字符串和字符,那就是他们公司全部人的脑袋都被门夹过 他自己家都要发非常多国家的版本号的软件,怎么可能不用unicode呢 此处略去30字... 这里能够拿 ...
- 【2014 Multi-University Training Contest 3 1002】/【HDU 4888】 Redraw Beautiful Drawings
不easy啊.最终能够补第二个题了.! 顺便说一句:模版写残了就不要怪出题人啊 ~ (这残废模版研究了好长时间才找出错) 题目大意: 有一个n*m的矩阵.每个格子里都将有一个数.给你每一行数字之和和每 ...