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 ...
随机推荐
- 2012天津C题
行李箱上的密码锁大家都知道, 现在给我们长度为n(n<=1000)的两个密码串,每次可以转动连续的1->3个字符1格,问最少多少次可以使得第一个串变成第二个串 经历了搜索,贪心,的思路后, ...
- 为应用程序池“XX”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误
场景 WCF应用程序部署在IIS7中,使用net.tcp协议对外给几百台客户端提供服务,应用程序池不断崩溃重启. 分析过程 在事件查看器中看到的错误信息类似于 为应用程序池“XX”提供服务的进程在与 ...
- HQApi命令行接口配置
执行的命令行前准备 在您的个人文件夹中第一次创建 型材client.properties 如下面 cd C:\Users\scnyli\ mkdir ".hq" 创建一个 clie ...
- “AIR SDK 0.0: AIR SDK location “...\devsdks\AIRSDK\Win” does not exist.”问题解决~
原文同步至:http://www.waylau.com/air-sdk-0-0-air-sdk-location-does-not-exist-address/ 导入AS3项目时提示“AIR SDK ...
- java基础---->Zip压缩的使用(转)
java中提供了对压缩格式的数据流的读写.它们封装到现成的IO 类中,以提供压缩功能.下面我们开始java中压缩文件的使用. 目录导航: 关于压缩的简要说明 GZIP压缩文件的使用 ZIP压缩文件的使 ...
- Git使用操作指南和GitHub
本文记录Git的使用操作,把散落的记忆整理到一起.并介绍GitHub的使用. 使用Git代表着一种思想和境地,和SVN相比,不是技术上的差异有多么大,而是代表融入了一种新的生态环境.一种开放开源的心态 ...
- 【夸QT十一】外来物品:通用脚本帮助Web运行基础Linux命令
需求分析: 需要注意的是在这里第一次,这个人是不是QT系列文章,它是关于Web的,之所以写这篇文章.这是因为碍着Web相关开发时间,而且往往涉及linux与底层指令处理.例如,创建一个文件夹,删除一个 ...
- Silverlight的Socket通信
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPwAAAGwCAIAAAACJJ+TAAAgAElEQVR4nO2deXgT5534Rdhskme7+9
- Android System Property 解析
一 System Property 今天在折腾HDMI 显示,为Setting提供接口,遇到非常多跟Android系统属性相关的问题.因此,顺便分析和总结一些. android的代码中大量 ...
- 基于Tkinter利用python实现颜色空间转换程序
主要基于colorsys实现,例子是从hls转换到rgb,假设要换颜色空间非常easy仅仅须要改动一个函数 用到了Scale和Canvas组件 代码例如以下: from Tkinter import ...