意甲冠军:给你一个初始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 (双宽搜索)的更多相关文章

  1. hdu 1195 Open the Lock

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1195 Open the Lock Description Now an emergent task f ...

  2. hdu - 1195 Open the Lock (bfs) && hdu 1973 Prime Path (bfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=1195 这道题虽然只是从四个数到四个数,但是状态很多,开始一直不知道怎么下手,关键就是如何划分这些状态,确保每一个 ...

  3. hdu 1195:Open the Lock(暴力BFS广搜)

    Open the Lock Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  4. hdu 1195 Open the Lock(广搜,简单)

    题目 猜密码,问最少操作多少次猜对,思路很简单的广搜,各种可能一个个列出来就可以了,可惜我写的很搓. 不过还是很开心,今天第一个一次过了的代码 #define _CRT_SECURE_NO_WARNI ...

  5. hdu 1195 Open the Lock (BFS)

    Open the Lock Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  6. hdu 4778 Gems Fight! 博弈+状态dp+搜索

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4102743.html 题目链接:hdu 4778 Gems Fight! 博弈+状态dp+搜 ...

  7. HDU 3131 One…Two…Five! (暴力搜索)

    题目链接:pid=3131">HDU 3131 One-Two-Five! (暴力搜索) 题意:给出一串数字,要求用加,减,乘,除(5/2=2)连接(计算无优先级:5+3*6=8*6= ...

  8. hdu 1401(单广各种卡的搜索题||双广秒速)

    Solitaire Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total S ...

  9. hdu 1195(搜索)

    Open the Lock Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

随机推荐

  1. python学习笔记之四:条件,循环和其他语句

    前面已经介绍过几种基本语句(print,import,赋值语句),下面我们来介绍条件语句,循环语句. 一. print和import的更多信息 1.1 使用逗号输出 A.打印多个表达式,用逗号隔开,会 ...

  2. oracle 转 mysql 最新有效法(转)

    关键字:Oracle 转 MySQL . Oracle TO MySQL 没事试用了一下Navicat家族的新产品Navicat Premium,他集 Oracle.MySQL和PostgreSQL管 ...

  3. Ubuntu下轻松切换GDM, LightDM , KDM

    如果已经安装LightDM和GDM登录显示器.那么在Ubuntu下怎么在各种DM间任意切换呢? 举例: 以切换到GDM为例,打开终端,使用命令: sudo dpkg-reconfigure gdm 接 ...

  4. FlexPaper二次开发问题及搜索高亮显示

    原文:FlexPaper二次开发问题及搜索高亮显示 最近有个需求,做一个IT知识库,类似于文库,说到文库肯定会用到在线浏览文档了,所有在网上翻阅了一下类似豆丁的在线浏览器插件的资料,将其进行了二次开发 ...

  5. Java 并发专题 : Semaphore 实现 互斥 与 连接池

    继续并发方面的知识.今天介绍Semaphore,同样在java.util.concurrent包下. 本来准备通过例子,从自己实现到最后使用并发工具实现,但是貌似效果并不是很好,有点太啰嗦的感觉,所有 ...

  6. OpenStack Dashboard

    OpenStackDashboard 为管理员和普通用户提供了一个图形化管理界面.用户能够通过该界面訪问.分配或者自己主动化分配基于云的资源.可扩展的设计使得与第三方产品和服务融合变得非常easy,比 ...

  7. 得到Android系统语言设置

    private int g_lag = 1; // String filename = Locale.getDefault().getLanguage(); if (filename != null) ...

  8. SQL Server 2008 新增T-SQL 简写语法

    1.定义变量时可以直接赋值 DECLARE @Id int = 5 2.Insert 语句可以一次插入多行数据 INSERT INTO StateList VALUES(@Id, 'WA'), (@I ...

  9. 构建安全的Xml Web Service系列之wse之错误代码详解

    原文:构建安全的Xml Web Service系列之wse之错误代码详解 WSE3.0现在还没有中文版的可以下载,使用英文版的过程中,难免会遇到各种各样的错误,而面对一堆毫无头绪的错误异常,常常会感到 ...

  10. Windows 8实例教程系列 - 理解应用框架

    原文:Windows 8实例教程系列 - 理解应用框架 Windows 操作系统之所以风靡世界,是因为其“易学易用”,从用户的角度出发,让数以万计的非IT人员使用计算机实现娱乐,工作等目的.Windo ...