https://cn.vjudge.net/problem/LightOJ-1121

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
char /*ans[1011],*/now[];int len;
int x,y,a[][];//xx1[4][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0};
int xx2[][]={{,},{,},{,},{,},{,},{,},{,},{,},{,},
{,},{,},{,},{,},{,},{,},{,}};
bool fl;
int T,n,maxd;
inline int abs1(int x){return x>?x:-x;}
//估价函数:除0以外,所有数当前位置与目标位置的曼哈顿距离之和
int hh()
{
int i,j,cnt=;
for(i=;i<;++i)
for(j=;j<;++j)
if(a[i][j])
cnt+=abs1(i-xx2[a[i][j]][])+abs1(j-xx2[a[i][j]][]);
return cnt;
}
inline void swap1(int &a,int &b)
{
int t=a;a=b;b=t;
}
//#define swap(a,b) {t=a;a=b;b=t;}
#define swap swap1
void dfs(int d,char pre)
{
//printf("1t%d\n",d);
int h=hh();
if(!h) {fl=;/*memcpy(ans,now,sizeof(char)*(len+1));*/return;}
if(d+h>maxd) return;
if(x!= && pre!='U')
{
//now[++len]='D';
swap(a[x][y],a[x+][y]);++x;
dfs(d+,'D');
if(fl) {now[++len]='D';return;}
//--len;
--x;swap(a[x][y],a[x+][y]);
}
if(y!= && pre!='R')
{
//now[++len]='L';
swap(a[x][y-],a[x][y]);--y;
dfs(d+,'L');
if(fl) {now[++len]='L';return;}
//--len;
++y;swap(a[x][y-],a[x][y]);
}
if(y!= && pre!='L')
{
//now[++len]='R';
swap(a[x][y+],a[x][y]);++y;
dfs(d+,'R');
if(fl) {now[++len]='R';return;}
//--len;
--y;swap(a[x][y+],a[x][y]);
}
if(x!= && pre!='D')//不要让操作刚好抵消上一次操作,实测很有效
{
//now[++len]='U';
swap(a[x][y],a[x-][y]);--x;
dfs(d+,'U');
if(fl) {now[++len]='U';return;}
//--len;
++x;swap(a[x][y],a[x-][y]);
}
}
/*
判无解,
https://blog.csdn.net/obsorb_knowledge/article/details/79915484
A=将16个数排成一行,((0,0),(0,1),(0,2),(0,3),(1,0),(1,1),..的顺序)
删去0,当前状态这么做之后的逆序对数与目标状态奇偶性是否相同
(相同为1,不同为0)
B=当前状态0的行号与目标状态的奇偶性是否相同
有解要求满足:A==B
*/
bool judge()
{
int tmp[],x0,i,j;
tmp[]=;
for(i=;i<;++i)
for(j=;j<;++j)
if(a[i][j])
tmp[++tmp[]]=a[i][j];
else
x0=i;
//for(i=1;i<=15;++i)
// printf("1t%d\n",tmp[i]);
int a1=;
for(i=;i<=;++i)
for(j=;j<i;++j)
if(tmp[j]>tmp[i])
++a1;
//printf("2t%d %d\n",a1&1,3-x0);
return (a1&)==((-x0)&);
}
int main()
{
int i,j;
scanf("%d",&T);
for(int TT=;TT<=T;++TT)
{
fl=;len=;
for(i=;i<;++i)
for(j=;j<;++j)
{
scanf("%d",&a[i][j]);
if(a[i][j]==) x=i,y=j;
}
printf("Case %d: ",TT);
if(!judge())
{
puts("This puzzle is not solvable.");
continue;
}
for(maxd=;maxd<=;++maxd)
{
dfs(,);
//printf("1t%d\n",maxd);
if(fl) break;
}
//printf("2t%d\n",maxd);
if(fl)
{
for(i=len;i>=;--i)
printf("%c",now[i]);
puts("");
}
else
puts("This puzzle is not solvable.");
}
return ;
}

另有

https://cn.vjudge.net/problem/SCU-1110

https://cn.vjudge.net/problem/UVA-10181

15 Puzzle LightOJ - 1121的更多相关文章

  1. 15 Puzzle (4乘4谜题) IDA*(DFS策略与曼哈顿距离启发) 的C语言实现

    大家好!这是我的第一篇博客,由于之前没有撰写博客的经验,并且也是初入计算机和人工智能领域,可能有些表述或者理解不当,还请大家多多指教. 一.撰写目的 由于这个学期在上算法与数据结构课程的时候,其中一个 ...

  2. 拼图游戏js

    实现算法: 1. JavaScript动态生成拼图:通过生成16个div,且除最后一个div不使用背景图片以外,其他div都设置拼图图片为背景.然后通过调整background-position来实现 ...

  3. iOS 滑块拼图游戏(Puzzle8)

    代码地址如下:http://www.demodashi.com/demo/11505.html 一.准备工作 先了解一个定义和定理 定义:在一个1,2,...,n的排列中,如果一对数的前后位置与大小顺 ...

  4. lightoj 1370 欧拉函数

    A - Bi-shoe and Phi-shoe Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & % ...

  5. LightOJ 1236 - Pairs Forming LCM(素因子分解)

    B - Pairs Forming LCM Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu ...

  6. LightOj 1289 - LCM from 1 to n(LCM + 素数)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1289 题意:求LCM(1, 2, 3, ... , n)%(1<<32), ...

  7. LightOj 1278 - Sum of Consecutive Integers(求奇因子的个数)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1278 题意:给你一个数n(n<=10^14),然后问n能用几个连续的数表示; 例 ...

  8. (最长公共子序列+推导)Love Calculator (lightOJ 1013)

    http://www.lightoj.com/volume_showproblem.php?problem=1013   Yes, you are developing a 'Love calcula ...

  9. CoolShell Puzzle攻略[更新隐藏剧情]

    CoolShell博主陈皓做了一个在线的puzzle很有意思,链接在这里,这里记录一下解题的一些步骤. Puzzle 0 ++++++++[>+>++>+++>++++> ...

随机推荐

  1. 强制浏览器下载PDF文件

    if(empty($filename)) { return FALSE; } // http headers header('Content-Type: application-x/force-dow ...

  2. 发现eclipse红叉,查看markers发现Target runtime Apache Tomcat v8.0 is not defined

    导入以前的项目(Markers中注意查看,就在console选项卡旁边),报以下错误,但不影响操作: Faceted Project Problem        Target runtime Apa ...

  3. 3D Flip

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 基于django封装的常用装饰器和函数

    1:返回操作成功的json数据 def response_success(message, data=None, data_list=[]): return HttpResponse(json.dum ...

  5. Godot-3D教程-01.介绍3D

    创建一个3D游戏将是个挑战,额外增加的Z坐标将使许多用于2D游戏的通用技术不再有用.为了帮助变换(transition),值得一提的是Godot将使用十分相似的API用于2D和3D. 目前许多节点是公 ...

  6. loj 6089 小 Y 的背包计数问题——分类进行的背包

    题目:https://loj.ac/problem/6089 直接多重背包,加上分剩余类的前缀和还是n^2的. 但可发现当体积>sqrt(n)时,个数的限制形同虚设,且最多有sqrt(n)个物品 ...

  7. CF 438 E & bzoj 3625 小朋友和二叉树 —— 多项式开方

    题目:http://codeforces.com/contest/438/problem/E https://www.lydsy.com/JudgeOnline/problem.php?id=3625 ...

  8. SQL 优化总结(二) 索引

     索引 1.索引的建立 缺省情况下建立的索引是非群集索引,但有时它并不是最佳的:合理的索引设计要建立在对各种查询的分析和预测上. 一般来说: (1) 有大量重复值.且经常有范围查询(between, ...

  9. POJ2387(最短路入门)

    Til the Cows Come Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 38556   Accepted ...

  10. Day06:迭代器,生成器,生成表达式,面向过程编程,包及常用模块

    今日内容:1.迭代器(****)2.生成器(***)3.生成器表达式(*****)4.面向过程编程(*****)5.包的使用(***)6.常用模块    logging (*****)    re ( ...