U596513 数字华容道(基础版)

题目背景

[提升版](https://www.luogu.com.cn/problem/U599041) 小e发现了一个有趣的游戏:数字华容道! (我总算会写 $Special\ Judge$ 了!!!!!)

题目描述

规则是这样的:在 $3\times3$ 的棋盘上,有 $8$ 个标有数字 $1-8$ 的滑块和一个空格(表示为 $0$)。每次操作可以将一个滑块移动到相邻的空格中。最终需要复原成如下图的样子:\ ![](https://cdn.luogu.com.cn/upload/image_hosting/2w5s27sg.png)\ 小e玩的时候,一直在思考一个问题:对于每个打乱状态的盘面,最少需要移动几步才能复原呢?他实在想不过来,就想请你来帮忙。\ 现在,小e给了你一个初始状态,让你求出恢复目标状态的最少移动步数。并且,小e还想让你输出移动滑块的序列。请你来帮帮他吧! (全部状态 $=9!=362880$) :::info[本题SPJ] ```cpp #include "testlib.h" struct Move { int fx, fy, tx, ty; }mo[1000005]; int len=0; bool cc(int x, int y) { return (x3 || y3); } int StoI(std::string s) { std::stringstream ss; sst; return t; } int main(int argc, char* argv[]) { registerTestlibCmd(argc, argv); int pm[10][10]; for(int i=1;i1000000) { quitf(_wa,"The answer is too long"); } } for(int i=1;i

输入格式

输入一个 $3\times3$ 的方阵,表示初始的盘面,空格表示为 $0$。

输出格式

如果有解,输出: >第一行,输出一个整数 $n$,表示恢复目标状态的最少移动步数。\ >接下来 $n$ 行,每行输出一次移动滑块的操作,格式为:```(x1,y1)->(x2,y2)```,表示让一个滑块从```(x1,y1```,移动到```(x2,y2)```(必须是空格)。 >### 注:输出的最后一行不能有空行!否则即使是对的也会出错! >如果有多种最优解,移动序列只用输出其中一种(已开启$Special\ Judge$) 否则输出```unsolvable```。

说明/提示

## 样例4解释 其实还有一种解法,视频我放附件里了,输出两种皆可。 ### 数据范围 对于 $100\%$ 的数据,输入的数字在 $0-9$ 之间且不重复。 ### 关于SPJ 对于每个测评点: |最短步数是否正确|输出的移动序列是否能还原数字华容道|得分倍率| |:-:|:-:|:-:| | ✅ | ✅ | $100\%$ | | ✅ | ❌ | $50\%$ | | ❌ | ✅ | $75\%$ | | ❌ | ❌ | $0\%$ | - 如果输出的最少移动步数正确,具体移动序列也正确,可得 $100\%$ 的分。 - 如果输出的最少移动步数正确,而具体移动序列不正确,可得 $50\%$ 的分。 - 如果输出的最少移动步数不正确,该测评点不得分。