zoukankan      html  css  js  c++  java
  • 洛谷 P1379 八数码难题

    题目描述

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

    输入输出格式

    输入格式:

     

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

     

    输出格式:

     

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

     

    输入输出样例

    输入样例#1:
    283104765
    
    输出样例#1:
    4

    题解:迭代加深搜索+A×
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    int k,ans,X,Y,a[4][4];
    int mx[4]={0,1,0,-1},
        my[4]={1,0,-1,0};
    int golx[9]={0,1,1,1,2,3,3,3,2},
        goly[9]={0,1,2,3,3,3,2,1,1};
    
    int H(){
        int bns=0;
        for(int i=1;i<=3;i++){
            for(int j=1;j<=3;j++){
                if(a[i][j]){
                    bns+=abs(i-golx[a[i][j]])+abs(j-goly[a[i][j]]);
                }
            }
        }
        return bns;
    }
    
    void dfs(int x,int y,int g,int k){
        int h=H();
        if(!h){
            ans=g;
            return;
        }
        if(g>=k||ans||g+h>k)return;
        for(int i=0;i<4;i++){
            int xx=x+mx[i],yy=y+my[i];
            if(xx>=1&&yy>=1&&xx<=3&&yy<=3){
                swap(a[x][y],a[xx][yy]);
                dfs(xx,yy,g+1,k);
                swap(a[x][y],a[xx][yy]);
            }
        }
    }
    
    int main(){
        for(int i=1;i<=3;i++){
            for(int j=1;j<=3;j++){
                char x;
                scanf("%c",&x);
                a[i][j]=x-'0';
                if(!a[i][j])X=i,Y=j;
            }
        }
        for(k=0;;k++){
            dfs(X,Y,0,k);
            if(ans){
                printf("%d
    ",ans);
                return 0;
            }
        }
        return 0;
    }
     
  • 相关阅读:
    钉钉服务器端SDK PHP版
    戒不掉
    亲历钓鱼网站
    我整理的PHP 7.0主要新特性
    JavaScript中JSON的处理心得
    X3D中Profile如何翻译
    你可以写什么?
    Gitblit中采用Ticket模式进行协作开发
    理解JavaScript中的事件处理 阻止冒泡event.stopPropagation();
    测试Remoting三种信道Http,Tcp,Ipc和Web Service的访问速度 (转)
  • 原文地址:https://www.cnblogs.com/zzyh/p/7617786.html
Copyright © 2011-2022 走看看