zoukankan      html  css  js  c++  java
  • 题解 P1379 【八数码难题】

    传送门

    用STL中的queue,map,string写了个广搜,用一个string保存状态(见代码)注:STL比较慢,可以做一些优化(或者开O2)

    #include<iostream>
    
    #include<cstdio>
    
    #include<string>
    
    #include<queue>
    
    #include<map>
    
    using namespace std;
    
    string start;
    
    map<string,long long>m;//保存这个状态需要几步到达
    
    map<string,bool>b;//判重,记录状态是否经过
    
    queue<string>q;//队列
    
    int main()
    
    {
    
        cin>>start;
    
        q.push(start);
    
        b[start]=1;
        m[start]=0;//处理初始状态
        while(!q.empty())
        {
            string cnt=q.front();q.pop();//取队首
            if(cnt=="123804765")break;//目标状态(终止条件)
            string s2="0";
            int position=cnt.find(s2,0);//查找0的位置
            string s3=cnt;//见下文
            if(position-3>=0)
            {
                swap(s3[position],s3[position-3]);/*骚操作,可以交换string中两个位置的值(知道s3干什么的了吧……)*/
                if(!b[s3])
                {
                m[s3]=m[cnt]+1;
                q.push(s3);
                b[s3]=1;
                }//入队
                s3=cnt;//别忘了改回来
            }//往上跑
            if(position-1>=0&&(position)%3!=0)/*往左跑,注意判越界*/
            {
                swap(s3[position],s3[position-1]);
                if(!b[s3])
                {
                m[s3]=m[cnt]+1; 
                q.push(s3);
                b[s3]=1;
                }
                s3=cnt;
            }
            if(position+1<cnt.size()&&(position+1)%3!=0)//往右跑
            {
                swap(s3[position],s3[position+1]);
                if(!b[s3])
                {
                m[s3]=m[cnt]+1; 
                q.push(s3);
                b[s3]=1;
                }
                s3=cnt;
            }
            if(position+3<cnt.size())//往下跑
            {
                swap(s3[position],s3[position+3]);
                if(!b[s3])
                {
                m[s3]=m[cnt]+1; 
                q.push(s3);
                b[s3]=1;
                }
                s3=cnt;
            }
        }
        printf("%d",m["123804765"]);//因为保证有解,所以直接输出答案。
    }

     

  • 相关阅读:
    面试题-JAVA算法题
    分布式
    linux中文件描述符fd和struct file结构体的释放
    Linux字符设备驱动
    Linux内存地址管理概述
    mnist卷积网络实现
    【TensorFlow官方文档】MNIST机器学习入门
    FCN笔记
    datetime.timedelta
    tensorflow中的函数获取Tensor维度的两种方法:
  • 原文地址:https://www.cnblogs.com/zzh666/p/9005195.html
Copyright © 2011-2022 走看看