广搜 |
您所在的位置:网站首页 › 拼图游戏破解 › 广搜 |
先看题: 小 C 做了一个拼图游戏,大家来破解它吧。 游戏规则:每次可以移动相邻的两张图片,所有图片都在指定的位置上,游戏完成。 简化问题,每次输入一个 3 × 3 3\times 3 3×3 的矩阵,表示要拼的图。 分析可以发现此题搜索树特别庞大,所以不进行状态判重是不行的。 所以我们可以开一个 9 9 9 维的 bool 数组来进行判重,但这样子空间复杂度约为 1GB,如果你家电脑能开的下也行。 很明显如果只对一个状态判重,那多开的其他空间就是浪费,所以考虑将一个 3 × 3 3\times 3 3×3 的矩阵压成一个 9 9 9 位十进制整数,如将矩阵: 123 456 789压成 123456789 123456789 123456789,但是普通的数组开不到 1 0 9 10^9 109 的所以可以用 map 或哈希实现。 而广搜时只需将整数化为矩阵进行操作,再将矩阵压成整数放入队列。 代码实现时有些技巧,具体看代码。 #include #define int long long using namespace std; const int N = 15, mod = 1000003;//哈希模数设为质数效率会高些 int dx[] = {0, 1, 0}, dy[] = {0, 0, 1}; vector nbr[mod + 5];//哈希数组 bool find(int x){//查找有没有出现过 int P = x % mod; for(int i = 0; i |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |