POJ1077 八数码 BFS
BFS 几天的超时...
A*算法不会,哪天再看去了.
/*
倒搜超时,
改成顺序搜超时
然后把记录路径改成只记录当前点的操作,把上次的位置记录下AC..不完整的人生啊
*/ #include <iostream>
#include <queue>
#include <vector>
#include <iterator>
#include <string>
using namespace std; const int MAXX_SIZE = ; int fac[] = {,,,,,,,,};
bool used[MAXX_SIZE]; struct Nod
{
string str; //数组
int postion9; //可交换的位置
}nod[MAXX_SIZE]; struct Step
{
int last;
char c; //l0, r1, u2, d3 }step[MAXX_SIZE]; int dir[][] = {,, -,, ,, ,- }; char st[] = {'d', 'u', 'r', 'l'}; int Kt(string str, int n)
{
int i, j, cnt, sum=;
for (i=; i<n; i++)
{
cnt = ;
for (j=i+; j<n; j++)
if (str[i] > str[j])
cnt++;
sum += cnt * fac[n--i];
}
return sum;
} string InverKt(int sum, int n)
{
int i, j, t;
bool Int[];
string str;
for (i=; i<n; i++)
{
t = sum / fac[n--i];
for (j=; j<n; j++)
{
if (Int[j])
{
if (t == )
break;
t--;
}
}
str += j++'';
Int[j] = false;
sum %= fac[n--i];
}
//str += '\0';
return str;
} void bfs(string str, int pos)
{
queue<int>que; //string str = "123456789";
int i, m, n = Kt(str, );
int ii, jj, ti, tj, t; nod[n].str = str;
nod[n].postion9 = pos;
step[n].last = -;
que.push(n);
used[n] = true; while (!que.empty())
{
n = que.front();
que.pop();
ii = nod[n].postion9 / ;
jj = nod[n].postion9 % ;
for (i=; i<; i++)
{
ti = ii + dir[i][];
tj = jj + dir[i][];
if (ti < || ti > || tj < || tj > )
continue;
t = ti*+tj;
swap(nod[n].str[nod[n].postion9], nod[n].str[t]);
m = Kt(nod[n].str, ); if (!used[m])
{
used[m] = true;
nod[m].str = nod[n].str;
nod[m].postion9 = t;
step[m].last = n;
step[m].c = st[i] ;
//step[m].str = step[n] + st[i]; 超时!
if (m == )
return ;
que.push(m);
}
swap(nod[n].str[nod[n].postion9], nod[n].str[t]);
}
}
} void show(int m)
{
if (step[m].last == -)
return;
show(step[m].last);
cout<<step[m].c;
} int main()
{ int i, n=, m, pos;
char c;
string str;
for (i=; i<n; i++)
{
cin>>c;
if (c == 'x')
{
pos = i;
c = '';
}
str+= c;
}
bfs(str, pos);
// m = Kt(str, n);
if (!used[])
cout<<"unsolvable"<<endl;
else
show();
return ;
}
POJ1077 八数码 BFS的更多相关文章
- hdu-1043(八数码+bfs打表+康托展开)
参考文章:https://www.cnblogs.com/Inkblots/p/4846948.html 康托展开:https://blog.csdn.net/wbin233/article/deta ...
- HDU1043 八数码(BFS + 打表)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 , 康托展开 + BFS + 打表. 经典八数码问题,传说此题不做人生不完整,关于八数码的八境界 ...
- 紫书p199 八数码(BFS,hash)
八数码问题 紫书上的简单搜索 渣渣好久才弄懂 #include<cstdio> #include<cstring> using namespace std; const i ...
- POJ1077 八数码问题
题目:八数码 网址:http://poj.org/problem?id=1077 在一个3×3的网格中,1~8这8个数字和一个"X"恰好不重不漏地分布在这3×3的网格中. 例如: ...
- code1225 八数码Bfs
Bfs搜索 1.把棋盘直接作为状态: #include<iostream> #include<cstring> #include<queue> #include&l ...
- luogu_1379 八数码难题
八数码-->BFS+set #include<iostream> #include<cstdlib> #include<cstdio> #include< ...
- ACM/ICPC 之 BFS-广搜进阶-八数码(经典)(POJ1077+HDU1043)
八数码问题也称为九宫问题.(本想查查历史,结果发现居然没有词条= =,所谓的历史也就不了了之了) 在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同.棋盘上还有一个 ...
- 由八数码问题引入。对BFS有更深考虑
12号到今天共研究八数码问题poj1077,首先用的是普通BFS,遇到很多问题,开始用一个二级指针作为结构成员,知道了二级指针与二维数值名的不同!http://write.blog.csdn.net/ ...
- BFS(八数码) POJ 1077 || HDOJ 1043 Eight
题目传送门1 2 题意:从无序到有序移动的方案,即最后成1 2 3 4 5 6 7 8 0 分析:八数码经典问题.POJ是一次,HDOJ是多次.因为康托展开还不会,也写不了什么,HDOJ需要从最后的状 ...
随机推荐
- 【Hadoop】MapReduce笔记(四):MapReduce优化策略总结
Cloudera 提供给客户的服务内容之一就是调整和优化MapReduce job执行性能.MapReduce和HDFS组成一个复杂的分布式系统,并且它们运行着各式各样用户的代码,这样导致没有一个快速 ...
- 【Data Structure & Algorithm】在排序数组中查找和为定值的两个数
在排序数组中查找和为定值的两个数 题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字,要求时间复杂度是O(n).如果有多对数字的和等于输入的数字,输出 ...
- Flutter实战视频-移动电商-25.列表页_使用Provide控制子类-1
25.列表页_使用Provide控制子类-1 主要是二级分类的UI布局 1分15秒 生成我们的右侧动态类 定义list变量 开始写里面的子项,把每一个小的写了 再拼成一个大的 这样我们的小类就写完了 ...
- UVaLive 3971 Assemble (水题二分+贪心)
题意:你有b元钱,有n个配件,每个配件有各类,品质因子,价格,要每种买一个,让最差的品质因子尽量大. 析:很简单的一个二分题,二分品质因子即可,每次计算要花的钱的多少,每次尽量买便宜且大的品质因子. ...
- Fitnesse中TemplateLibrary的使用方法
1.新建一个SuitePage,命名为TemplateLibrary 2.然后如下图,添加作为template的TestPage,如下面的Get 3.在Get page中添加template内容,如下 ...
- C++中拷贝构造函数
C++中拷贝构造函数 1.什么是拷贝构造函数: 拷贝构造函数嘛,当然就是拷贝和构造了.(其实很多名字,只要静下心来想一想,就真的是顾名思义呀)拷贝又称复制,因此拷贝构造函数又称复制构造函数.百度百科上 ...
- CodeForces754D【贪心】
题意: 有n个区间,每个区间覆盖区间里一段数,求最大连续区间长度被覆盖k次,并输出选取的区间. 思路: 贪心: 感觉一开始肯定是要把区间按left从小到大排序的. 然后肯定是连续k个区间能够达到的重叠 ...
- unity5之代码创建状态机,玩的666
http://blog.csdn.net/litaog00/article/details/50483189 最近做项目的时候用到了状态机,网上搜了一下帖子,大部分都是简单介绍使用方法的,讲解的详细的 ...
- performSegueWithIdentifier:sender里边的sender是啥意思
performSegueWithIdentifier:sender里边的sender是啥意思啊?怎样用啊? [self performSegueWithIdentifier:@"pushSi ...
- ssh断开后保持程序运行
https://blog.csdn.net/gatieme/article/details/52777721 https://blog.51cto.com/zjking/1117828 https:/ ...