首页 > 其他分享 >1.八数码 (搜索进阶 BFS)

1.八数码 (搜索进阶 BFS)

时间:2023-05-03 16:22:51浏览次数:51  
标签:tem 网格 BFS start second 数码 first string 进阶

八数码

题目

在一个 \(3×3\) 的网格中,\(1∼8\) 这 \(8\) 个数字和一个 \(X\) 恰好不重不漏地分布在这 \(3×3\) 的网格中。
例如:

1 2 3
X 4 6
7 5 8

在游戏过程中,可以把 X 与其上、下、左、右四个方向之一的数字交换(如果存在)。

我们的目的是通过交换,使得网格变为如下排列(称为正确排列):

1 2 3
4 5 6
7 8 X

例如,示例中图形就可以通过让 X 先后与右、下、右三个方向的数字交换成功得到正确排列。

交换过程如下:

1 2 3   1 2 3   1 2 3   1 2 3
X 4 6   4 X 6   4 5 6   4 5 6
7 5 8   7 5 8   7 X 8   7 8 X

把 X 与上下左右方向数字交换的行动记录为 u、d、l、r。

现在,给你一个初始网格,请你通过最少的移动次数,得到正确排列。

输入格式

输入占一行,将 3×3
的初始网格描绘出来。

例如,如果初始网格如下所示:

1 2 3 
x 4 6 
7 5 8 

则输入为:1 2 3 x 4 6 7 5 8

输出格式

输出占一行,包含一个字符串,表示得到正确排列的完整行动记录。

如果答案不唯一,输出任意一种合法方案即可。

如果不存在解决方案,则输出 unsolvable

输入样例:

2 3 4 1 5 x 7 6 8

输出样例

ullddrurdllurdruldr

思路

\(BFS\) 向上下左右四个方向扩展,注意将一维坐标与二维坐标的互相转换:$x=k/3,y=k%3 $

代码

#include<bits/stdc++.h>
using namespace std;
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};

void bfs(string start)
{
	string op="urdl";
	queue<string>q;
	unordered_map<string,pair<int,string>>d;
	q.push(start);
	d[start].first=0;
	d[start].second="";
	string end="12345678x";
	
	while(q.size())
	{
		auto t=q.front();
		q.pop();	
		if(t==end)
		{
		    for(auto x:d[t].second)
		        cout<<x;
		    return;
		}
		int pos=t.find('x');
		
		int x=pos/3,y=pos%3;
		
		for(int i=0;i<4;i++)
		{
			int a=x+dx[i],b=y+dy[i];
			string tem=t;
			swap(tem[pos],tem[a*3+b]);
			if(a<0||a>=3||b<0||b>=3||d[tem].first)continue;
			d[tem].first=d[t].first+1;
			d[tem].second=d[t].second+op[i];
			q.push(tem);
		}
		
	}
	
	puts("unsolvable");
}
int main()
{
	char x;
	string str;
	for(int i=0;i<9;i++)
	{
		cin>>x;
		str+=x;
	}
	
	bfs(str);

	return 0;
}

标签:tem,网格,BFS,start,second,数码,first,string,进阶
From: https://www.cnblogs.com/zzmxj/p/17369204.html

相关文章

  • 10.起火迷宫(简单搜索 多源BFS)
    起火迷宫↑题目链接题目一个迷宫可以看作一个\(R\)行\(C\)列的方格矩阵。其中一些方格是空地,用.表示,其他方格是障碍,用#表示。开始时,乔位于一块空地之中。迷宫中一些空地已经起火了,幸运的是火还没有蔓延至乔所在的位置。为了避免被火烧伤,乔需要尽快逃离迷宫。已知......
  • 12.石油储备(简单搜索 DFS/BFS 统计连通块个数)
    石油储备题目一片土地可以看作是一个\(n\)行\(m\)列的方格矩阵。其中一些方格藏有石油,用@表示,其余方格没有石油,用*表示。每个方格都与其上、下、左、右、左上、右上、左下、右下八个方格视为相邻。如果两个藏有石油的方格相邻,则它们被认为是处于同一片油田,否则它们被......
  • 14.找路(简单搜索 BFS 最短步数)
    找路↑题目链接题目给定一个\(n\)行\(m\)列的方格矩阵。其中有些方格是空地(可以进入),有些方格是餐厅(可以进入),有些方格是障碍(不可进入)。开始时,小\(Y\)和小\(M\)各自位于一个空地方格中。每个人都可以沿上下左右四个方向进行移动,移动一格距离需要花费\(11\)分钟时间。......
  • 9.点火游戏(简单搜索 BFS)
    点火游戏↑题目链接题目给定一个\(N\)行\(M\)列的方格矩阵。其中一部分方格是草地,其余部分是空地。草地能够被燃烧,空地不会。当某个草地在\(t\)时刻被点燃时,其上下左右四个方向的相邻方格中的草地方格也会在\(t+1\)时刻被点燃。注意,空地方格无论如何都不可能被点燃。......
  • 11.迷宫问题(BFS 储存路径)
    迷宫问题↑题目链接题目给定一个\(n×n\)的二维数组,如下所示:intmaze[5][5]={0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,0,};它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上......
  • 13.非常可乐(简单搜索 BFS)
    非常可乐题目大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是\(N\)毫升和\(M\)毫升。可......
  • 8.罐子(简单搜索 BFS最短步数+记录方案)
    罐子↑题目链接题目给你两个罐子,容积分别为\(A\)升和\(B\)升。现在,你可以进行如下三种操作:FILL(i),将罐子\(i(1≤i≤2)\)灌满水。DROP(i),将罐子\(i(1≤i≤2)\)清空。POUR(i,j),将罐子\(i\)中的水倒向罐子\(j\),直到罐子\(i\)空了或罐子\(j\)满了为止。请问,至少......
  • 7.洗牌(简单搜索 BFS)
    洗牌↑题目链接题目给定两叠纸牌\(S1\)和\(S2\),每叠恰好有\(C\)张牌。每张牌的尺寸大小都完全相同,但是颜色可能不同。下面介绍洗牌规则。不妨设\(S1\)中纸牌从上到下编号依次为\(a_1,a_2,…,a_C\),\(S_2\)中纸牌从上到下编号依次为\(b_1,b_2,…,b_C\)。洗牌就......
  • 3.抓住那头牛(简单搜索 BFS)
    抓住那头牛↑题目链接题目农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点\(N\),牛位于点\(K\)。农夫有两种移动方式:从\(X\)移动到\(X−1\)或\(X+1\),每次移动花费一分钟从\(X\)移动到\(2∗X\),每次移动花费一分钟假设牛没有意识到农夫的行动,站......
  • 2.地牢大师(简单搜索 BFS)
    地牢大师↑题目链接题目你现在被困在一个三维地牢中,需要找到最快脱离的出路!地牢由若干个单位立方体组成,其中部分不含岩石障碍可以直接通过,部分包含岩石障碍无法通过。向北,向南,向东,向西,向上或向下移动一个单元距离均需要一分钟。你不能沿对角线移动,迷宫边界都是坚硬的岩石,你......