zoukankan      html  css  js  c++  java
  • vijosP1360-八数码问题

    【问题描述】

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

    【格式】

    输入格式

    输入初试状态,一行九个数字,空格用0表示

    输出格式

    只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数(测试数据中无特殊无法到达目标状态数据)

    样例输入1

    283104765

    样例输出1

    4

    直接广搜

    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<queue>
    #include<set>
    using namespace std;
    const int xx[4]={0,0,1,-1};
    const int yy[4]={1,-1,0,0};
    
    struct node
    {
       string s;
       int step;
    };
    set<string>st;queue<node>q;
    string aa="123804765",src;
    int ans;
    int bfs()
    {
    	node t;
    	t.s=src;t.step=0;
    	q.push(t);
    	st.insert(src);
    	while(!q.empty())
    	{
    		int i;int x,y,x1,y1;
    		t=q.front();q.pop();
    		if(t.s==aa)	return t.step;
    		for (i=0;i<=8;i++)
    		if(t.s[i]=='0') break;
      		x=i/3,y=i%3;//行,列
    		  for(int j=0;j<=3;j++)
    		{
    		  		x1=x+xx[j];y1=y+yy[j];
    		  		if(x1>=0&&x1<=2&&y1>=0&&y1<=2)
      			{
      	   	int k=x1*3+y1;//链 
      	   	node tt=t;
      	   	tt.s[i]=t.s[k];tt.s[k]=t.s[i];
      	   	tt.step++;
      	   	set<string>::iterator it;
      	   	it=st.find(tt.s);
      	   	if(it==st.end())
      	   	{
      	   		q.push(tt);
      	   		st.insert(tt.s);
      	   	}
    			} 
    		}
    	}
    }
    int main()
    {
    	cin>>src;
    	ans=bfs();
    	cout<<ans;
    	return 0;
    }
  • 相关阅读:
    Redis基本概念、基本使用与单机集群部署
    Storm安装部署
    HBase单机和集群版部署
    Hive基础概念、安装部署与基本使用
    Hadoop — HDFS的概念、原理及基本操作
    随机森林
    深度学习入门: CNN与LSTM(RNN)
    word修改页眉使本页的页眉与别的页不一样
    几个值得学习的Java博客
    【转】求最短路径长度--简单易懂
  • 原文地址:https://www.cnblogs.com/937337156Zhang/p/5658688.html
Copyright © 2011-2022 走看看