BFS解决九宫重排问题

问题 1426: [蓝桥杯][历届试题]九宫重排

时间限制: 1Sec 内存限制: 128MB 提交: 215 解决: 47

题目描述

如下面第一个图的九宫格中,放着  1~8  的数字卡片,还有一个格子空着。与空格子相邻的格子中的卡片可以移动到空格中。经过若干次移动,可以形成第二个图所示的局面。

我们把第一个图的局面记为:12345678. 
把第二个图的局面记为:123.46758 
显然是按从上到下,从左到右的顺序记录数字,空格记为句点。 
本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动可以到达。如果无论多少步都无法到达,则输出-1。

输入

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

输出

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

样例输入

12345678.
123.46758 

样例输出

3

实现代码如下:(我用了string来记录已经出现过的排列情况,应该用其它方法储存速度会更快)

#include<string.h>
#include<iostream>
#include<set>
using namespace std;
int main()
{
set<string>s;
string arr[200000];
int front=0;int rear=0;
int dis[200000]={0};
int pos=0;
string beg,des;
cin>>beg>>des;
if(beg==des){cout<<0<<endl;return 0;
}
s.insert(beg);int dalta[4]={-1,1,-3,3};
arr[front]=beg;
while(front<=rear)
{
beg=arr[front];
for(pos=0;pos<9;pos++)if(beg[pos]==‘.‘)break;
for(int i=0;i<4;i++)
{
if(pos==0||pos==1||pos==2)if(i==2)continue;
if(pos==6||pos==7||pos==8)if(i==3)continue;
if(pos==0||pos==3||pos==6)if(i==0)continue;
if(pos==2||pos==5||pos==8)if(i==1)continue;
int p=pos+dalta[i];
char c=beg[pos];beg[pos]=beg[p];beg[p]=c;
if(s.count(beg)==0)
{
s.insert(beg);
arr[++rear]=beg;dis[rear]=dis[front]+1;
if(beg==des)
{
cout<<dis[front]+1<<endl;return 0;
}
}
c=beg[pos];beg[pos]=beg[p];beg[p]=c;
}
front++;
}
cout<<-1<<endl;return 0;
}



原文地址:https://www.cnblogs.com/linruier/p/8605926.html

时间: 2024-11-09 04:37:19

BFS解决九宫重排问题的相关文章

九宫重排(搜索)

1581: 题目名称:九宫重排 时间限制: 1 Sec  内存限制: 128 MB提交: 2  解决: 1[提交] [状态] [讨论版] [命题人:外部导入] 题目描述 问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12345678.把第二个图的局面记为:123.46758显然是按从上到下,从左到右的顺序记录数字,空格记为句点. 本题目的任务是已知

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

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

九宫重排_康拓展开_bfs

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

蓝桥杯OJ PREV-19 九宫重排

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

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

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

每天刷个算法题20160526:BFS解决八数码问题(九宫格问题)

版权所有.所有权利保留. 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/51524864 为了防止思维僵化,每天刷个算法题.已经刷了几天了,现在发点代码. 我已经建了一个开源项目,每天的题目都在里面: https://github.com/Xiaofei-it/Algorithms 绝大部分算法都是我自己写的,没有参考网上通用代码.读者可能会觉得有的代码晦涩难懂,因为那是我自己的理解. 最近几天都是在写一些原来的东西

[LeetCode] BFS解决的题目

一.130  Surrounded Regions(https://leetcode.com/problems/surrounded-regions/description/) 题目: 解法: 这道题的意思是将所有被X包围的O都变为X(边缘的不算),我们可以维护一个队列,先把四周的O的位置放进队列中,并把这个位置的值变为Y.然后每次从队列中拿出一个位置,把这个位置四周为O的位置的值变为Y,再把这个位置放进队列(为什么要先变值再进队列呢?在下一道题中会说).一直到队列为空时,我们就成功地把所有直接

有关dfs、bfs解决迷宫问题的个人见解

可以使用BFS或者DFS方法解决的迷宫问题! 题目如下: kotori在一个n*m迷宫里,迷宫的最外层被岩浆淹没,无法涉足,迷宫内有k个出口.kotori只能上下左右四个方向移动.她想知道有多少出口是她能到达的,最近的出口离她有多远? 输入描述: 第一行为两个整数n和m,代表迷宫的行和列数 (1≤n,m≤30) 后面紧跟着n行长度为m的字符串来描述迷宫.'k'代表kotori开始的位置,'.'代表道路,'*'代表墙壁,'e'代表出口.保证输入合法. 输出描述: 若有出口可以抵达,则输出2个整数,

九宫重排

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