九宫重排(搜索)

1581: 题目名称:九宫重排

时间限制: 1 Sec  内存限制: 128 MB
提交: 2  解决: 1
[提交] [状态] [讨论版] [命题人:外部导入]

题目描述

问题描述
如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着。与空格子相邻的格子中的卡片可以移动到空格中。经过若干次移动,可以形成第二个图所示的局面。
我们把第一个图的局面记为:12345678.
把第二个图的局面记为:123.46758
显然是按从上到下,从左到右的顺序记录数字,空格记为句点。
本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动可以到达。如果无论多少步都无法到达,则输出-1。

输入

输入格式
输入第一行包含九宫的初态,第二行包含九宫的终态。

输出

输出格式
输出最少的步数,如果不存在方案,则输出-1。

样例输入

复制样例数据

12345678.
123.46758

样例输出

3bfs+康托展开判断是否重复操作
#include<bits/stdc++.h>
#include<queue>
#include<bits/stdc++.h>
using namespace std;
int p[15], q[15],t[1000005][15],cnt[1000005],vis[1000005];
int fac[15] = { 1 };
int d[5][5] = { {1,0},{-1,0},{0,1},{0,-1} };
int kt(int *a) {
      int sum = 0,u=0;
      for (int i = 0; i < 8; i++) {
          u = 0;
          for (int j = i + 1; j < 9; j++) {
              if (a[i] > a[j])u++;
          }
          sum += u * fac[8 - i];
      }
      if (vis[sum])return 0;
      else {
          vis[sum] = 1;
          return 1;
      }
}
int bfs() {
       int head = 0, tail = 1;
       memcpy(t[0], p, sizeof(p));
       while (head < tail) {
           int tmp[15];
           memcpy(tmp, t[head], sizeof(t[head]));
           if (memcmp(tmp, q,sizeof(q)) == 0)return head;
           int k;
           for (k = 0; k < 9; k++)if (!tmp[k])break;
           int x = k / 3, y = k % 3;
           for (int i = 0; i < 4; i++) {
               int cx = x + d[i][0], cy = y+d[i][1];
               if (cx < 0 || cy < 0 || cx>2 || cy>2)continue;
               int now = 3 * cx + cy;
               int temp[15];
               memcpy(temp, tmp, sizeof(tmp));
               temp[k] = tmp[now];
               temp[now] = 0;
               if (kt(temp))memcpy(t[tail],temp,sizeof(temp)),cnt[tail++] = cnt[head]+1;
           }
           ++head;
       }
       return -1;
}
int main() {
    char ch;
    //for (int i = 1; i <= 10; i++)cout << fac[i] << endl;
    for (int i = 1; i <= 9; i++)fac[i] = i * fac[i - 1];
    //for (int i = 1; i <= 10; i++)cout << fac[i] << endl;
    for (int i = 0; i < 9; i++) {
        cin >> ch;
        if (ch == ‘.‘)p[i] = 0;
        else p[i] = ch - ‘0‘;
    }
    for (int i = 0; i < 9; i++) {
        cin >> ch;
        if (ch == ‘.‘)q[i] = 0;
        else q[i] = ch - ‘0‘;
    }
    int ans = bfs();
    if (ans == -1)cout << -1 << endl;
    else cout << cnt[ans] << endl;
    return 0;
}

原文地址:https://www.cnblogs.com/czy-power/p/10356930.html

时间: 2024-10-31 09:37:24

九宫重排(搜索)的相关文章

算法笔记_183:历届试题 九宫重排(Java)

目录 1 问题描述 2 解决方案   1 问题描述 问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12345678. 把第二个图的局面记为:123.46758 显然是按从上到下,从左到右的顺序记录数字,空格记为句点. 本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动可以到达.如果无论多少步都无法到达,则输出-1. 输入格式 输入第一行包含

九宫重排_康拓展开_bfs

历届试题 九宫重排 时间限制:1.0s   内存限制:256.0MB 问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12345678. 把第二个图的局面记为:123.46758 显然是按从上到下,从左到右的顺序记录数字,空格记为句点. 本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动可以到达.如果无论多少步都无法到达,则输出-1. 输入格

蓝桥杯 历届试题 九宫重排 经典八数码问题 A*算法+康托展开

历届试题 九宫重排 时间限制:1.0s   内存限制:256.0MB 问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12345678. 把第二个图的局面记为:123.46758 显然是按从上到下,从左到右的顺序记录数字,空格记为句点. 本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动可以到达.如果无论多少步都无法到达,则输出-1. 输入格

蓝桥杯OJ PREV-19 九宫重排

题目描述: 历届试题 九宫重排 时间限制:1.0s   内存限制:256.0MB 问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12345678. 把第二个图的局面记为:123.46758 显然是按从上到下,从左到右的顺序记录数字,空格记为句点. 本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动可以到达.如果无论多少步都无法到达,则输出-

BFS解决九宫重排问题

问题 1426: [蓝桥杯][历届试题]九宫重排 时间限制: 1Sec 内存限制: 128MB 提交: 215 解决: 47 题目描述 如下面第一个图的九宫格中,放着  1~8  的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12345678. 把第二个图的局面记为:123.46758 显然是按从上到下,从左到右的顺序记录数字,空格记为句点. 本题目的任务是已知九宫的初态和终态,求最少经过多少步的

九宫重排

康托展开式去重来一发bfs #include<iostream> #include<map> #include<string> #include<cstring> #include<cstdio> #include<cstdlib> #include<cmath> #include<queue> #include<vector> #include<algorithm> using nam

算法-蓝桥杯习题(六)

蓝桥杯习题 蓝桥杯练习系统习题加答案,总共分为6部分,90%习题使用C语言解答,部分使用C++或者Java.大部分习题为搜索参考或者别人提供所得,不足之处在所难免,恳请批评指正(预计200多题,习题仅供学习交流) 目录 算法训练(详见 算法-蓝桥杯习题(一))Go 算法训练(详见 算法-蓝桥杯习题(二))Go 算法提高(waiting...) 历届试题(详见 算法-蓝桥杯习题(六))Go 历届试题(详见 算法-蓝桥杯习题(七))Go 蓝桥杯练习系统评测数据 链接: http://pan.baid

蓝桥杯练习系统题解

转于:http://www.cnblogs.com/cshhr/p/3550014.html 蓝桥杯官网练习系统题解(非VIP) BEGIN-4(Fibonacci数列) 有递推公式,大家都知道用递推公式求,仅仅要记得在递推的时候同一时候取模求好 这里给一份另类代码,用矩阵高速幂求,事实上还有循环节 /* (1 1) * (Fn-1) = ( Fn )//矩阵相乘,将就着看吧 (1 0) (Fn-2) (Fn-1) (1 1) * (1 1) * (Fn-2) = ( Fn ) (1 0) (1

EditPlus 快捷键

FileFtpUpload ? ? ? Ctrl+Shift+S ? ? ? 上传文件到 FTP 服务器 FileNew ? ? ? ? ? Ctrl+N ? ? ? ? ? 新建普通的文本文档 FileNewHtml ? ? ? Ctrl+Shift+N ? ? ? 创建一个空白的 HTML 页面 FileNewBrowser ? ? Ctrl+Shift+B ? ? ? 新建浏览器窗口 FileOpen ? ? ? ? Ctrl+O ? ? ? ? ? 打开一个现有的文档 FileOpenH