首页 > 其他分享 >2022-11-22 Acwing每日一题

2022-11-22 Acwing每日一题

时间:2022-11-22 13:34:57浏览次数:80  
标签:11 状态 dist 22 int 交换 网格 2022 include

本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我会认真改正的。同时也希望文章能够让你有所收获,与君共勉!

八数码

在一个 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

现在,给你一个初始网格,请你求出得到正确排列至少需要进行多少次交换。

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

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

1 2 3
x 4 6
7 5 8

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

输出格式
输出占一行,包含一个整数,表示最少交换次数。

如果不存在解决方案,则输出 −1。

输入样例:
2 3 4 1 5 x 7 6 8
输出样例
19

算法原理

代码实现

#include <iostream>
#include <cstring>
#include <algorithm>

#include<queue>
#include<unordered_map>
using namespace std;

unordered_map<string,int> d;
queue<string> q;

int dx[] = {-1,1,0,0},dy[] = {0,0,-1,1};

int bfs(string state){
    string end = "12345678x";
    // 初始化状态和哈希表
	q.push(state);
	d[state] = 0;
	
	while(q.size()){
		auto t = q.front();
		q.pop();	// 队头变成已经搜索过的状态
		int dist = d[t];    // 该状态对应的操作数
		
		if(t == end)	return dist;
		
		int k = t.find('x');	// 找到x在字符串中的位置,返回的是他的下标
		int x = k / 3,y = k % 3;	// 一维数组中的位置索引转化成二维中的位置索引
		for(int i = 0; i < 4;  ++i){
			int a = x + dx[i],b = y + dy[i];
			if(a >= 0 && a < 3 && b >= 0 && b < 3){	// 对搜索位置进行限制,必须在图内
				swap(t[a*3+b],t[k]);	// 搜索位置于x的位置,状态转移操作
				if(!d.count(t))	// 表示操作过的状态没有出现过就加入该状态
				{
					q.push(t);
					d[t] = dist + 1;	// 上一个状态进行的操作数+1
				}
				swap(t[a*3+b],t[k]);	// 状态回溯,因为我们是直接对状态图进行改变,为了不影响其他状态,所以需要进行回溯
			}
		}
	}
	return -1;
}

int main(void){
	char s[2];
	string start = "";
	for(int i=0; i < 9 ; ++i){
		
		cin >> s;
		start += *s;
	} 
	cout << bfs(start) << endl;
	return 0;	
}

标签:11,状态,dist,22,int,交换,网格,2022,include
From: https://www.cnblogs.com/WangChe/p/16914847.html

相关文章

  • 11.22 回顾面试题
    1.说一下vue的父子组件传参使用i自定义属性和自定义事件传参使用ref属性传参vuex传参2.说一下vue2和vue3的区别template是多个根标签因为fragment......
  • 【华为OJ11】数字颠倒
    题目描述描述:输入一个整数,将这个整数以字符串的形式逆序输出程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001输入描述:输入一个int整数......
  • 2022-11-22
    2H上涨,20F下跌  20F下跌,预计20F级别背驰。20F下跌的两个下跌分别是10F下跌+15F下跌  总结:等20F的次级别回调开多......
  • go1.11 wasm helloworld
    go1.11版本中已经支持了对go程编译出web可执行的wasm文件,向js的强悍地位提出了挑战。试水:1.新建main.gopackagemainimport("fmt")funcmain(){fmt.Println(......
  • 【数组11】和为S的两个数字
    题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述:对应每个测试案例......
  • 2022年11月10篇论文推荐
    随着最大的人工智能研究会议(NeurIPS2022)即将到来,我们进入了2022年的最后阶段。让我们回顾一下人工智能世界最近发生了什么。在介绍推荐论文之前,先说一个很有意思的项目......
  • 大数据-11.22
    scp-r--路径--地址--路径      //远程拷贝souce--配置文件路径         //重载配置文件hadoopnamenode-format     //......
  • C++11
    longlong超长整形 C++11longlong超长整形详解(biancheng.net)    待更。。。......
  • NPOI Excel导入:时间格式2022/5/26导入变成26-5月-2022
    //NPOI导入日期格式处理stringmytime=dateStr.Trim();//dateStr为Excel导入的日期值IFormatProviderculture=newCultureInfo("zh-CN",true);......
  • 11的动态检测
    无聊就爆了,看能不能混个精,md高手勿喷反正我reloadgame.dll老是不成功,于是我就直接搞,没想到还挺简单我用的CE用OD会省去很多步骤,不过习惯了11设置里参数加个-window方......