UVALive 6665 Dragonâs Cruller --BFS,类八数码问题
题意大概就是八数码问题,只不过把空格的移动方式改变了:空格能够向前或向后移动一格或三格(循环的)。
分析:其实跟八数码问题差不多,用康托展开记录状态,bfs即可。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstdlib>
#define Mod 1000000007
#define SMod 10007
#define INint 2147483647
#define LL (0x3f3f3f3f3f3f3f3f)*2
#define ll long long
using namespace std;
#define N 500007 struct node
{
ll cantor,cost;
int pos;
bool operator <(const node& a)const
{
return cost > a.cost;
}
}S,E; priority_queue<node> que;
ll fact[] = {,,,,,,,,,,};
int dx[] = {,-,,-};
int a[],b[],Can[N][],vis[N];
ll ans,ch,cv; ll Cantor(int *a)
{
int i,j;
ll cnt;
ll res = ;
for(i=;i<;i++)
{
cnt = ;
for(j=i+;j<;j++)
if(a[i] > a[j])
cnt++;
res += cnt*fact[-i];
}
return res;
} void getcantor(ll cantor,int *a)
{
for(int i=;i<;i++)
Can[cantor][i] = a[i];
} void geta(ll cantor)
{
for(int i=;i<;i++)
a[i] = Can[cantor][i];
} void bfs()
{
while(!que.empty())
que.pop();
memset(vis,,sizeof(vis));
int i,j;
que.push(S);
//vis[S.cantor] = 1;
while(!que.empty())
{
node tmp = que.top();
que.pop();
ll cantor = tmp.cantor;
ll cost = tmp.cost;
int pos = tmp.pos;
if(vis[cantor])
continue;
vis[cantor] = ;
if(cost >= ans)
continue;
if(cantor == E.cantor)
{
ans = min(ans,cost);
break;
}
geta(cantor);
for(int k=;k<;k++)
{
int v = (pos+dx[k]+)%;
swap(a[v],a[pos]);
ll newcantor = Cantor(a);
if(vis[newcantor])
{
swap(a[v],a[pos]);
continue;
}
getcantor(newcantor,a);
swap(a[v],a[pos]);
node now;
now.cantor = newcantor;
now.pos = v;
if(k < )
now.cost = cost + ch;
else
now.cost = cost + cv;
if(now.cost >= ans)
continue;
//vis[newcantor] = 1;
que.push(now);
}
}
} int main()
{
int i,j;
while(scanf("%lld%lld",&ch,&cv) && (ch||cv))
{
for(i=;i<;i++)
{
scanf("%d",&a[i]);
if(a[i] == )
S.pos = i;
}
S.cantor = Cantor(a);
S.cost = ;
for(i=;i<;i++)
scanf("%d",&b[i]);
E.cantor = Cantor(b);
getcantor(S.cantor,a);
getcantor(E.cantor,b);
ans = (1LL<<);
bfs();
printf("%lld\n",ans);
}
return ;
}
UVALive 6665 Dragonâs Cruller --BFS,类八数码问题的更多相关文章
- HDU 1043 Eight (BFS·八数码·康托展开)
题意 输出八数码问题从给定状态到12345678x的路径 用康托展开将排列相应为整数 即这个排列在全部排列中的字典序 然后就是基础的BFS了 #include <bits/stdc++.h ...
- BFS:八数码问题
#include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> ...
- 八数码问题+路径寻找问题+bfs(隐式图的判重操作)
Δ路径寻找问题可以归结为隐式图的遍历,它的任务是找到一条凑够初始状态到终止问题的最优路径, 而不是像回溯法那样找到一个符合某些要求的解. 八数码问题就是路径查找问题背景下的经典训练题目. 程序框架 p ...
- Poj 1077 eight(BFS+全序列Hash解八数码问题)
一.题意 经典的八数码问题,有人说不做此题人生不完整,哈哈.给出一个含数字1~8和字母x的3 * 3矩阵,如: 1 2 X 3 4 6 7 5 8 ...
- 习题:八数码难题(双向BFS)
八数码难题(wikioi1225) [题目描述] 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出 ...
- BFS(八数码) POJ 1077 || HDOJ 1043 Eight
题目传送门1 2 题意:从无序到有序移动的方案,即最后成1 2 3 4 5 6 7 8 0 分析:八数码经典问题.POJ是一次,HDOJ是多次.因为康托展开还不会,也写不了什么,HDOJ需要从最后的状 ...
- [cdoj1380] Xiper的奇妙历险(3) (八数码问题 bfs + 预处理)
快要NOIP 2016 了,现在已经停课集训了.计划用10天来复习以前学习过的所有内容.首先就是搜索. 八数码是一道很经典的搜索题,普通的bfs就可求出.为了优化效率,我曾经用过康托展开来优化空间,甚 ...
- JAVA四类八种基本数据类型
boolean类型 Boolean在内存中占用一个字节. 当java编译器把java源代码编译为字节码时,会用int或byte来表示boolean.在java虚拟机中,用整数零来表示false,用任意 ...
- 【算法】BFS+哈希解决八数码问题
15拼图已经有超过100年; 即使你不叫这个名字知道的话,你已经看到了.它被构造成具有15滑动砖,每一个从1到15上,并且所有包装成4乘4帧与一个瓦块丢失.让我们把丢失的瓷砖“X”; 拼图的目的是安排 ...
随机推荐
- 二、SQL语句映射文件(2)增删改查、参数、缓存
//备注:该博客引自:http://limingnihao.iteye.com/blog/106076 2.2 select 一个select 元素非常简单.例如: Xml代码 收藏代码 <!- ...
- sphinx使用随笔
为什么需要进行全文搜索呢? 一个表中有a.b.c多个字段.我们使用sql进行like搜索的时候,往往只能匹配某个字段.或者是这样的形式:a LIKE “%关键词%”or b LIKE “关键词” 这样 ...
- 1秒30000QPS,前后端设计思路
Q:现在有这样一个需求,在一秒中有3万的支付订单请求,有什么比较好的解决方案吗? PS:我们数据库用的是oracle 程序是java spring mybatis dubbo mq等技术,现在有这样一 ...
- sharepoint 顺序工作流创建
顺序工作流提供了一系列有组织的步骤,一般情况下,步骤是逐一执行的. 1.新建 > 项目,选择 SharePoint解决方案 > 空项目: 2.部署为场解决方案 3.添加 > 新项,选 ...
- 往UISegmentedControl上添加几个控制器
#import "RootViewController.h" #import "LoginViewController.h" #import "Reg ...
- 利用PPT的WebBroswer控件助力系统汇报演示
如何在PPT演示过程中无缝衔接演示系统成果?使用PPT自带的WebBroswer控件即可,相当于在PPT里嵌入了浏览器,在这个浏览器里打开系统进行操作演示. 环境:Windows 7 + Office ...
- clang: error: no such file or directory: xxx.pch
今天打开一个下载的例子 报clang: error: no such file or directory: xxx.pch的错 说一下解决方案 1.先在你的工程里找到这.pch文件- 2.把它现在的路 ...
- Objective-C的可变是如何实现的?
Objective-C的可变是怎么实现的?
- 《慕客网:IOS-动画入门》学习笔记
新建Cocoa Touch Class,语言是swift 然后继续为界面添加一个普通的View Controller,并且添加前面视图的静态table的转向剪头指向这个View Controller, ...
- JSON取值前判断
public static void main(String[] args)throws Exception{ String jsonStr1="{\"access_token\& ...