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"]);//因为保证有解,所以直接输出答案。
    }

     

  • 相关阅读:
    EntityFramework 启用迁移 EnableMigrations 报异常 "No context type was found in the assembly"
    JAVA 访问FTP服务器示例(2)
    NuGet Package Manager 更新错误解决办法
    JAVA 访问FTP服务器示例(1)
    RemoteAttribute 的使用问题
    诡异的 javascript 变量
    javascript apply用法
    Babun 中文乱码
    GSM呼叫过程
    转站博客园
  • 原文地址:https://www.cnblogs.com/zzh666/p/9005195.html
Copyright © 2011-2022 走看看