一、题意:类似于华容道,输入是8个数字,输入虽然是一行,但实际是以两行的方式操作的。0表示空位,别的相邻数字可移动到该位置上。求最少移动步骤得到指定的状态。

二、思路:这题可以用BFS来解决。因为在每一步可以产生两个状态,类似于走迷宫里的移动,不同的是这里的坐标变化是一维的:+1,-1,+4,-4。这里需要注意一点是坐标3不能+1,坐标4不能-1,因为这里是排两行的,所以这个小细节很关键。每个状态可以用字符串和0的坐标0来存储(map),并且可以用改字符串对应的整数来标记该状态是否出现过已达到剪枝的效果。这里用到了几个小技巧:1、int类型和string类型的相互转换  2、map的使用。用map来记录到各个状态的步数。如果用数组来存,会MLE。 3.打表。这个很关键,因为逆向思维来说,初始状态都是“01234567”,所以打表后后面直接查表,效率会高很多,不然会TLE。 4.pair函数的使用。用一个pair类型的队列来记录每一个状态以及这个状态下0的位置。 5.在做坐标交换时,我自定义了一个Change函数,也可以用系统自带的swap函数,更简洁。

三、代码:

#include"iostream"
#include"stdio.h"
#include"queue"
#include"string.h"
#include"map"
#include"sstream"
#include"stdlib.h"
using namespace std; typedef pair<string,int> P; int inputSample[10];
string inputString;
map<string,int>state; string Int2String(int &a)
{
ostringstream oss;
oss<<a;
return oss.str();
} bool Judge(int x)
{
if(x>=0&&x<8) return true;
return false;
} string Change(int a,int b,string str)
{
char tmp=str[a];
str[a]=str[b];
str[b]=tmp; return str;
} int Bfs()
{
queue<P> que; que.push(P("01234567",0));
while(que.size())
{
P p=que.front();que.pop(); int dir[4]={1,-1,4,-4}; for(int i=0;i<4;i++)
{
if(p.second==3&&dir[i]==1) continue;
if(p.second==4&&dir[i]==-1) continue;
int nx=p.second+dir[i];
if(Judge(nx))
{
string str=Change(p.second,nx,p.first);
if(state.find(str)==state.end())
{
state[str]=state[p.first]+1;
que.push(P(str,nx));
}
}
}
}
return -1;
} int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
state["01234567"]=0;
Bfs();
while(scanf("%d",&inputSample[0])==1)
{
for(int i=1;i<8;i++)
cin>>inputSample[i];
inputString=""; for(int i=0;i<8;i++)
{
inputString+=Int2String(inputSample[i]);
} cout<<state[inputString]<<endl;
}
return 0;
}

  

  

aoj0121的更多相关文章

  1. 《挑战程序设计竞赛》2.1 广度优先搜索 AOJ0558 POJ3669 AOJ0121

    AOJ0558 原文链接: AOJ0558 题意: 在H * W的地图上有N个奶酪工厂,分别生产硬度为1-N的奶酪.有一只吃货老鼠准备从老鼠洞出发吃遍每一个工厂的奶酪.老鼠有一个体力值,初始时为1,每 ...

  2. 挑战程序2.1.5 穷竭搜索>>宽度优先搜索

    先对比一下DFS和BFS         深度优先搜索DFS                                   宽度优先搜索BFS 明显可以看出搜索顺序不同. DFS是搜索单条路径到 ...

  3. poj1077 Eight【爆搜+Hash(脸题-_-b)】

    转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4298840.html   ---by 墨染之樱花 题目链接:http://poj.org/pr ...

随机推荐

  1. python3--列表生成式

    # Auther: Aaron Fan # 原始的写法:a = []for i in range(10): a.append(i*2)print(a) # 用列表生成式完成上面的写法:a = [i*2 ...

  2. js精度(摘)

    Math.formatFloat = function (f, digit) {    var m = Math.pow(10, digit);    return parseInt(f * m, 1 ...

  3. Servlet中response对象Commit状态的分析

    response是服务端对客户端请求的一个响应,其中封装了响应头.状态码.内容(也就是最终要在浏览器上显示的HTML代码或者其他数据格式)等. 服务端在把response提交到客户端之前,会使用一个缓 ...

  4. 编写高质量代码改善C#程序的157个建议——建议13: 为类型输出格式化字符串

    建议13: 为类型输出格式化字符串 有两种方法可以为类型提供格式化的字符串输出.一种是意识到类型会产生格式化字符串输出,于是让类型继承接口IFormattable.这对类型来 说,是一种主动实现的方式 ...

  5. Linq 左连接 left join

    Suppose you have a tblRoom and tblUserInfo. Now, you need to select all the rooms regardless of whet ...

  6. C#生成静态文件

    一般生成文件都是通过读取模板文件,然后替换标签. 这些古老的方法使用起来不但麻烦而且效率还不怎么样. 这里给添加介绍一个方法. 如果你用过asp.net.mvc (Razor),你就应该明白 chtm ...

  7. angular 响应式表单

  8. 「BZOJ1000」A+B Problem

    写这个主要是为了凑\(BZOJ\)题解用的,不用在意.跳过即可 \(Code\) #include<bits/stdc++.h> using namespace std; int main ...

  9. CPU 和 GPU 的区别

    作者:知乎用户链接:https://www.zhihu.com/question/19903344/answer/96081382来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  10. iOS应用审核时间注意点

    1.重大节假日不审核 美国重大节假日期间不审核,具体审核时间查看官方通知