首页 > 其他分享 >八数码难题

八数码难题

时间:2023-11-25 16:11:57浏览次数:34  
标签:难题 node int 布局 空格 数码 棋子 BFS

BFS 训练的好题

在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字。棋盘中留有一个空格,空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变。

输入#1

283104765

输入#2

4

using namespace std;
map<string,int>vis;
struct node{
	string s;
	int t;
	node(){};
	node(string a,int b){
		s=a;
		t=b;
	}
};
queue<node>q;
bool BFS(){
	while(q.size()){
		node u = q.front();
		q.pop();
		if(u.s=="123804765"){
			cout<<u.t;
			return true;
		}
		string s=u.s;
		for(int i=0;i<9;i++){
        if(s[i]=='0')
        {
            if(i>=3&&i<=8){//向上拓展 
                swap(s[i],s[i-3]);
                if(s=="123804765"){
                    cout<<u.t+1<<endl;
                    return true;
                }
                if(vis[s]==0){
                    vis[s]=1;
                    q.push(node(s,u.t+1));
                }
                swap(s[i],s[i-3]);
            }
            if(i>=0&&i<=5)//向下拓展 
            {
                swap(s[i],s[i+3]);
                if(s=="123804765"){
                    cout<<u.t+1<<endl;
                    return true;
                }
                if(vis[s]==0){
                    vis[s]=1;
                    q.push(node(s,u.t+1));
                }
                swap(s[i],s[i+3]);
            }
            if(i%3==1||i%3==2)//向左拓展 
            {
                swap(s[i],s[i-1]); 
                if(s=="123804765"){
                    cout<<u.t+1<<endl;
                    return true;
                }
                if(vis[s]==0){
                    vis[s]=1;
                    q.push(node(s,u.t+1));
                }
                swap(s[i],s[i-1]); 
            }
            if(i%3==1||i%3==0)//向右拓展 
            {
                swap(s[i],s[i+1]); 
                if(s=="123804765"){
                    cout<<u.t+1<<endl;
                    return true;
                }
                if(vis[s]==0){
                    vis[s]=1;
                    q.push(node(s,u.t+1));
                }
                swap(s[i],s[i+1]); 
            }
            break;
        }
	 }
   }   return false;
}
int main(){
	string s;
	cin>>s;
	q.push(node(s,0));
    vis[s]=1;
	if(!BFS()){
		cout<<-1;
	}
	return 0;
} 

标签:难题,node,int,布局,空格,数码,棋子,BFS
From: https://www.cnblogs.com/yufan1102/p/17855620.html

相关文章

  • TM1628 TM1628A SOP28 LED数码管显示驱动IC 电磁炉芯片
    在当今的电子市场中,LED数码管显示驱动IC和电磁炉芯片的应用越来越广泛。其中,TM1628和TM1628A这两款SOP28封装的LED数码管显示驱动IC以及电磁炉芯片在许多领域都得到了广泛应用。本文将详细介绍这两款芯片的特点和应用。一、TM1628和TM1628A的特点1. 高效稳定TM1628和TM1628A采用了......
  • 光伏制造ERP有哪些品牌?可以解决哪些光伏制造难题
          光伏这类新兴行业近些年也迎来快速发展阶段,而不同应用场景的光伏产品有不同的制造工艺和生产工序以及质量和用料等方面的要求。另外,光伏生产过程中涉及的库存盘点、车间排期、物料损耗计算、生产成本核算、品质检验和工作中心产能评估等业务数据的实时共享问题......
  • 7段数码管绘制
    importturtle,datetimedefdrawLine(draw):#绘制单段数码管turtle.pendown()ifdrawelseturtle.penup()turtle.fd(40)turtle.right(90)defdrawDigit(digit):#根据数字绘制七段数码管drawLine(True)ifdigitin[2,3,4,5,6,8,9]elsedrawLine(False......
  • 对八数码的一些解释
    先简要解释一下从任何一个状态到目标状态的移动步数不可能小于所有数字当前位置与目标位置的曼哈顿距离之和考虑一次移动,只能让一个数字的曼哈顿距离加一或者减一,而目标状态所有数字的曼哈顿距离都是0,所以得证我们可以用普通的BFS做这道题目,由于边权是1,所以第一次搜索到的时候一......
  • 七段数码管绘制
      importturtle,datetime#定义一个,用于绘制代码管的间隙defdraw_gap():turtle.penup()turtle.forward(5)#定义一个函数,用于绘制一段代码管,这里传入的参数输一个bool类型defdraw_line(draw):draw_gap()turtle.pendown()ifdrawelseturtle.penup()......
  • 7段数码管绘制(小时,分,秒)
    7段数码管绘制(小时,分,秒)python代码:#七段数码管的绘制.pyfromturtleimport*#调用turtle、random、time库fromrandomimport*importtimedefdrawGap():penup()#提笔fd(5)defdrawLine(draw):drawGap()ifdraw:#除了七段数码管提笔,其......
  • 数码管问题
    importturtle,datetimedefdrawGap(): #绘制数码管间隔  turtle.penup()  turtle.fd(5)defdrawLine(draw): #绘制单段数码管  drawGap()  turtle.pendown()ifdrawelseturtle.penup()  turtle.fd(40)  drawGap()  turtle.right......
  • 7段数码管绘制
    7段数码管绘制运行代码importturtle,datetimedefdrawGap(): #绘制数码管间隔  turtle.penup()  turtle.fd(5)defdrawLine(draw): #绘制单段数码管  drawGap()  turtle.pendown()ifdrawelseturtle.penup()  turtle.fd(40)  draw......
  • 单片机+数码管
    利用8个数码管显示座位号+字母+学号后六位首先参考图参考程序可以了解到此程序实现了数码管显示OFF我们可以改的简单一点如下#include "reg51.h" //引入块unsigned char a_code[]{0x3f,0x71,0x00}; //共阴级数码管字段编码,我们选取重要的几个unsigned char a......
  • 7段数码管绘制
    importturtle,datetimedefdrawLine(draw): turtle.pendown()ifdrawelseturtle.penup()turtle.fd(40)turtle.right(90)defdrawDigit(digit): drawLine(True)ifdigitin[2,3,4,5,6,8,9]elsedrawLine(False)drawLine(True)ifdigitin......