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 ...
随机推荐
- Web的Flex弹性盒模型
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Python操作MongoDB和Redis
1. python对mongo的常见CURD的操作 1.1 mongo简介 mongodb是一个nosql数据库,无结构化.和去中心化. 那为什么要用mongo来存呢? 1. 首先.数据关系复杂,没有 ...
- pycharm配置QtDesigner
QtDesigner C:\Qt\Qt5.12.2\5.12.2\mingw73_64\bin\designer.exe $ProjectFileDir$ Pyuic C:\Anaconda3\pyt ...
- python----数据驱动ddt的使用
一.安装ddtpip install ddt 二.数据驱动和代码驱动数据驱动:根据你提供的数据来进行测试,比如接口自动化测试框架ATP代码驱动:必须得写代码才能测试,比如unittest 三.使用数据 ...
- angular ,require.js, angular-async-loader实现单页面路由,控制器js文件分离
https://github.com/heboliufengjie/appRoute/tree/re re 分支,实现,路由配置,控制器js文件分离
- c语言操作文件函数大全
fopen(打开文件)相关函数 open,fclose表头文件 #include<stdio.h>定义函数 FILE * fopen(const char * path,const cha ...
- FORTH 虚拟机内部结构
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- Thread 详解
转自:http://www.mamicode.com/info-detail-517008.html 目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 ...
- JAVA中接口与抛出异常的相关知识
1.接口概念:接口可以理解为一种特殊的类,由全局常量和公共的抽象方法所组成. 类是一种具体实现体,而接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部数据,也不关心这些类里方法的实现细节,它只 ...
- 字符串及其操作,字符的Unicode编码
plainText=input('message:') for c in plainText: print(chr(ord(c)-3),end='') plainText=input('message ...