1077 Eight
| Time Limit: 1000MS | Memory Limit: 65536K | |||
| Total Submissions: 37738 | Accepted: 15932 | Special Judge | ||
Description
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 x
where the only legal operation is to exchange 'x' with one of the tiles with which it shares an edge. As an example, the following sequence of moves solves a slightly scrambled puzzle:
1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4
5 6 7 8 5 6 7 8 5 6 7 8 5 6 7 8
9 x 10 12 9 10 x 12 9 10 11 12 9 10 11 12
13 14 11 15 13 14 11 15 13 14 x 15 13 14 15 x
r-> d-> r->
The letters in the previous row indicate which neighbor of the 'x' tile is swapped with the 'x' tile at each step; legal values are 'r','l','u' and 'd', for right, left, up, and down, respectively.
Not all puzzles can be solved; in 1870, a man named Sam Loyd was famous for distributing an unsolvable version of the puzzle, and
frustrating many people. In fact, all you have to do to make a regular puzzle into an unsolvable one is to swap two tiles (not counting the missing 'x' tile, of course).
In this problem, you will write a program for solving the less well-known 8-puzzle, composed of tiles on a three by three
arrangement.
Input
1 2 3
x 4 6
7 5 8
is described by this list:
1 2 3 x 4 6 7 5 8
Output
Sample Input
2 3 4 1 5 x 7 6 8
Sample Output
ullddrurdllurdruldr
Source
int contor(int ar[]) {
int v = ;
for (int i = ; i < ; i++) {
int num = ;
for (int j = i + ; j < ; j++) {
if (_______) num++;
}
v += num * fac[ - i];
}
return v + 1;
}
#include <stdio.h>
#include <queue>
#include <algorithm>
using namespace std;
int fac[];
int dx[] = {-, , , };
int dy[] = {, , , -};
char d[] = {'u','d','r','l'};
const int goal = , maxv = 4e5;
bool vis[maxv];
int pre[maxv];
char dir[maxv];
int dish(int ar[]) {
int dis = ;
for (int i = ; i < ; i++) {
if (ar[i] == ) continue;
int v = ar[i] - ;
int rx = i / , ry = i % ;
int x = v / , y = v % ;
dis += abs(x - rx) + abs(ry - y);
}
return dis;
}
int contor(int ar[]) {
int v = ;
for (int i = ; i < ; i++) {
int num = ;
for (int j = i + ; j < ; j++) if (ar[j] < ar[i]) num++; v += num * fac[ - i];
}
return v + ;
}
struct node {
int g, h, f, sta, xpos;
int s[];
void init() {
g++; h=dish(s); f=h+g; sta=contor(s);
}
bool operator < (const node x)const {
return f > x.f;
}
};
priority_queue<node> q;
bool Astar(node now) {
fill(vis, vis + maxv, );
while (!q.empty()) q.pop();
now.g = -;
now.init();
q.push(now);
pre[now.sta] = -;
vis[now.sta] = ;
while (!q.empty()){
now = q.top(); q.pop();
if (now.sta == goal) return true;
int xpos = now.xpos;
int x = xpos / , y = xpos % ;
for (int i = ; i < ; i++) {
int tx = x + dx[i];
int ty = y + dy[i];
if (tx < || ty < || tx >= || ty >= ) continue;
int newp = tx * + ty;
node tp = now;
tp.xpos = newp;
swap(tp.s[newp], tp.s[xpos]);
tp.init(); if (vis[tp.sta]) continue;
vis[tp.sta] = ;
pre[tp.sta] = now.sta;
dir[tp.sta] = d[i];
q.push(tp);
}
}
return false;
}
void Print(int sta) {
if (pre[sta] == -) return;
Print(pre[sta]);
printf("%c", dir[sta]);
}
int main() {
fac[] = ;
for (int i = ; i < ; i++) fac[i] = i * fac[i - ];
char str[];
while (gets(str)) {
int cnt = ;
node now;
for (int i = ; str[i]; i++) {
if (str[i] == ' ') continue;
if (str[i] == 'x') {
now.xpos = cnt;
now.s[cnt++] = ;
}
else
now.s[cnt++] = str[i] - '';
}
if (Astar(now)) Print(goal);
else printf("unsolvable");
printf("\n");
}
return ;
}
1077 Eight的更多相关文章
- hihocode 1077 : RMQ问题再临-线段树
#1077 : RMQ问题再临-线段树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到:小Hi给小Ho出了这样一道问题:假设整个货架上从左到右摆放了N种商品,并 ...
- HDU 1043 & POJ 1077 Eight(康托展开+BFS+预处理)
Eight Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 30176 Accepted: 13119 Special ...
- LightOJ::1077 -----奇妙的最大公约数
题目:http://www.lightoj.com/volume_showproblem.php?problem=1077 题意:在平面上, 给出两个点的坐标 例如:(x, y) 其中x, y 都是整 ...
- POJ 1077 && HDU 1043 Eight A*算法,bfs,康托展开,hash 难度:3
http://poj.org/problem?id=1077 http://acm.hdu.edu.cn/showproblem.php?pid=1043 X=a[n]*(n-1)!+a[n-1]*( ...
- hdu 1043 pku poj 1077 Eight (BFS + 康拓展开)
http://acm.hdu.edu.cn/showproblem.php?pid=1043 http://poj.org/problem?id=1077 Eight Time Limit: 1000 ...
- 九度OJ 1077 最大序列和 -- 动态规划
题目地址:http://ac.jobdu.com/problem.php?pid=1077 题目描述: 给出一个整数序列S,其中有N个数,定义其中一个非空连续子序列T中所有数的和为T的“序列和”. 对 ...
- hihocoder 1077线段树
http://hihocoder.com/problemset/problem/1077 #include <bits/stdc++.h> using namespace std; #de ...
- poj 1077 Eight(双向bfs)
题目链接:http://poj.org/problem?id=1077 思路分析:题目要求在找出最短的移动路径,使得从给定的状态到达最终状态. <1>搜索算法选择:由于需要找出最短的移动路 ...
- UVa 536 Tree Recovery | GOJ 1077 Post-order (习题 6-3)
传送门1: https://uva.onlinejudge.org/external/5/536.pdf 传送门2: http://acm.gdufe.edu.cn/Problem/read/id/1 ...
- PAT 1077 Kuchiguse
1077 Kuchiguse (20 分) The Japanese language is notorious for its sentence ending particles. Person ...
随机推荐
- 『计算机视觉』物体检测之RefineDet系列
Two Stage 的精度优势 二阶段的分类:二步法的第一步在分类时,正负样本是极不平衡的,导致分类器训练比较困难,这也是一步法效果不如二步法的原因之一,也是focal loss的motivation ...
- selenium chromedriver geckodriver iedriverserver下载
chromedriver与chrome的的对应版整理: chromedriver版本 chrome版本 v2.9 v31-v34 v2.10 v33-v36 v2.11 v36-v40 v2.12 v ...
- nmap工具简介
nmap参数介绍: -sL:简单列表扫描 -sn:扫描主机,但是不进行端口扫描 -sS:TCP SYN扫描[半开放扫描,扫描速度高且隐蔽性好] -p |-F:扫描端口列表与扫描次序,常用的扫描方式[- ...
- php代码审计——DVWA
1.命令注入: LOW等级: 输入没有任何限制,可以直接ping: Medium等级: 介绍一下str_replace()函数和array_key()函数: Str_replace(str1,str2 ...
- C++标准模板库(STL)之Map
1.Map的常用用法 map:映射.可以将任何基本类型,结构体,STL容器映射到任何基本类型包括容器. 使用map,需要加map的头文件,#include<map>和using names ...
- Hive 外部表的练习(多表关联查询,以及分组,子查询)
Hive 外部表的练习 hive创建库和表操作 hive加载数据,4种发放 1.数据放在Linux创建表结构 进行加载 2.先定义表结构.将一个查询select语句结果插入到表中 3.数据先放在hdf ...
- gevent模块学习(三)
3. Group类,常用于不限制数量的管理异步任务的分组且可搜集运行结果 g = gevent.pool.Group(*args) -> Group 说明: 创建一个组对象,其实就是一个不限gr ...
- printf()、sprintf()、vprintf()、vsprintf()(转)
转自http://sumsung753.blog.163.com/blog/static/14636450120112151092934/ 一.printf() printf()函数优点在于可以格式化 ...
- Mac下如何配置环境变量JDK
1.在英文输入法的状态下,按键盘“Ctrl + 空格”组合键,调出Spotlight搜索,在这里可以快速启动终端,输入ter,然后回车,即可打开终端: 2.如果你是第一次配置环境变量,可以使用“tou ...
- Webpack学习-Loader
什么是Loader? 继上两篇文章webpack工作原理介绍(上篇.下篇),我们了解到Loader:模块转换器,也就是将模块的内容按照需求装换成新内容,而且每个Loader的职责都是单一,只会完成一种 ...