首页 > 其他分享 >[刷题笔记] Luogu P1379 八数码

[刷题笔记] Luogu P1379 八数码

时间:2023-06-18 15:33:57浏览次数:74  
标签:set int Luogu 二维 数码 && P1379 include 刷题

Problem

Solution

题意非常明确,显然搜索,搜索的时候存储八数码可以用二维或者一维,但是个人感觉用二维更明了一些。

需要注意去重,去重可以用set维护一下已经搜过的八数码,如果手写去重小心MLE

具体实现的时候注意一下细节。

Code

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <string>
#include <set>
#define N 10010
using namespace std;
set <string> s;
typedef pair<int,int> PAIR;
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
int startt[5][5] ;
int cnt = 0;
struct Node
{
	int a[5][5];
	int vis;
};
PAIR get_zero(int a[5][5])
{
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++) if(!a[i][j]) return PAIR(i,j);
	}
}
bool get_ans(int a[5][5])
{
	string chk;
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++) chk += (a[i][j] + '0');
	}
	if(chk == "123804765") return true;
	else return false;
}
void bfs()
{
	queue <Node> q;
	Node inp;
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++) inp.a[i][j] = startt[i][j];
	}
	inp.vis = 0;
	q.push(inp);
	while(!q.empty())
	{
		Node p = q.front();
		q.pop();
		PAIR zero_add = get_zero(p.a);
		if(get_ans(p.a)) 
		{
			cout<<p.vis<<endl;
			return;
		}
		for(int i=0;i<4;i++)
		{
			int ax = zero_add.first + dx[i]; //找到当前为0的点
			int ay = zero_add.second + dy[i];
			if(ax>=1&&ax<=3&&ay>=1&&ay<=3) //如果不越界
			{
				int t[5][5];
				for(int j=1;j<=3;j++)//获得修改后的map
				{
					for(int k=1;k<=3;k++) t[j][k] = p.a[j][k]; 
				}
				t[zero_add.first][zero_add.second] = t[ax][ay];
				t[ax][ay] = 0;
                string pp;//转换成string与set内比较,去重操作
                for(int i=1;i<=3;i++) for(int j=1;j<=3;j++) pp += (char)t[i][j] +'0';
				if(!s.count(pp))  //如果不重复,即当前map没有被搜过
				{
					Node psh;
                    s.insert(pp);//将当前map加入set
					for(int j=1;j<=3;j++)  //入队
					{
						for(int k=1;k<=3;k++) psh.a[j][k] = t[j][k];
					}
					psh.vis = p.vis + 1; 
					q.push(psh);
				}
			}
		}
	}
}
int main()
{
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			scanf("%1d",&startt[i][j]);
		}
	}
	bfs();
} 

具体实现码量稍大,细节很多,比如将八数码转换成string放入set维护去重,具体存八数码二维数组即可,用string存操作更困难。

标签:set,int,Luogu,二维,数码,&&,P1379,include,刷题
From: https://www.cnblogs.com/SXqwq/p/17489195.html

相关文章

  • 算法刷题记录:AcWing 4908. 饥饿的牛
    目录题目链接:题目分析:时间复杂度SF代码AC代码:题目链接:https://www.acwing.com/problem/content/description/4911/题目分析:数据范围最大\(10^{14}\),所以如果采用枚举一定会TLE,因为只有\(10^5\)天会运来新的草,所以我们可以只考虑运草的天。假设当前到\(d_2\)天之前剩余干......
  • [刷题笔记] CF1059B Forgery
    ProblemSolution搜索染色类。我们发现染色是不可逆的,也就是染成了#后不得染回“.”,所以对于每次染色我们都要尽可能向std上靠拢。我们可以观察一下std,发现需要尽可能从std上的“.”向四周染色(因为3*3染色中间的"."不染)。每次染色前需要判断染完这一部分是否和std一致,如果一......
  • luogu P1963 [NOI2009] 变换序列
    luoguP1963[NOI2009]变换序列题意对于\(N\)个整数\(0,1,\cdots,N-1\),一个变换序列\(T\)可以将\(i\)变成\(T_i\),其中\(T_i\in\{0,1,\cdots,N-1\}\)且\(\bigcup_{i=0}^{N-1}\{T_i\}=\{0,1,\cdots,N-1\}\)。,\(\forallx,y\in\{0,1,\cdots,N-1\......
  • Luogu3792 由乃与大母神原型和偶像崇拜 - 线段树 - set -
    题目链接:https://www.luogu.com.cn/problem/P3792题解:一点小小的空间震撼(ML:125MB)首先询问可以转化成:区间\([l,r]\)的\(max-min+1=r-l+1\)并且区间内没有重复元素。可以考虑对每个点\(i\)记一个前驱结点\(pr_i\),表示\(a_{pr_i}=a_i\),且\(pr_i\)是\(i\)前面离\(i\)......
  • Luogu P1495 【模板】中国剩余定理(CRT)/ 曹冲养猪
    【模板】中国剩余定理(CRT)/曹冲养猪题目描述自从曹冲搞定了大象以后,曹操就开始捉摸让儿子干些事业,于是派他到中原养猪场养猪,可是曹冲满不高兴,于是在工作中马马虎虎,有一次曹操想知道母猪的数量,于是曹冲想狠狠耍曹操一把。举个例子,假如有\(16\)头母猪,如果建了\(3\)个猪圈,剩下......
  • luogu P7740 [NOI2021] 机器人游戏
    题面传送门一个bitset值52分?首先样例让你容斥你就容斥,枚举哪些位是可以的,计算每一位的\(p_0,p_1,q_0,q_1\)表示是否被要求最后是\(0/1\),是否有最终值是开始值异或\(0/1\)。然后每个位置的贡献可以分类讨论出来:如果\(p_0,p_1\)或者\(q_0,q_1\)都有,那只能空着。如......
  • 20230612刷题总结
    2023/06/12刷题总结A-DoubleCola如果n在1到5之间先单独判断是谁.如果大于5之后,用一个cnt记录当前这一组由几个人排在一起,然后使用循环每次动态的删除人数,直到找到n在那一组,然后将剩下的n直接整除pow(2,cnt)就可以了.#include<bits/stdc++.h>#defineintlonglong#d......
  • Luogu P7118
    题面题意很清楚,就不复述了。不难发现,我们首先要求出场景数小于给定galgame的galgame数量,于是我们需要求出场景数\(=i\)的galgame数量,设为\(f_i\)。考虑根节点,当A场景大小为\(j\)时,B场景的大小为\(i-j-1\)。枚举每个\(j\),不难得到\(f_i=\sum\limits_{j=0}^{i-1......
  • Luogu P2580 于是他错误的点名开始了
    于是他错误的点名开始了题目背景XS中学化学竞赛组教练是一个酷爱炉石的人。他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉(详情请见已结束比赛CON900)。题目描述这之后校长任命你为特派探员,每天记录他的点......
  • P1707 刷题比赛 题解
    多少有点混乱邪恶。题意:给出递推式:\[a_1=b_1=c_1=1\\a_2=b_2=c_2=3\\\begin{aligned}a_k&=p\timesa_{k-1}+q\timesa_{k-2}&+b_{k-1}+c_{k-1}&+r(k-2)^2+t(k-2)+1\\b_k&=u\timesb_{k-1}+v\timesb_{k-2}&+a_{k-1}+c_{k-1}&+w^{k-2}\\c......