码迷,mamicode.com
首页 > 其他好文 > 详细

洛谷【P1379】八数码难题

时间:2017-06-05 23:43:56      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:href   tps   i++   blog   step   ref   ret   测试   nbsp   

 

 P1379 八数码难题

题目描述

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

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

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


A*水之
喜闻乐见的Code
#include<cstdio>
#include<algorithm>
using namespace std;
const int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
const int aimx[10]={1,0,0,0,1,2,2,2,1};
const int aimy[10]={1,0,1,2,2,2,1,0,0};
int sta[3][3],Step,px,py,nowx[10],nowy[10];
bool flag;
int Guess() {
    int sum=0;
    for(int i=0;i<3;i++)
        for(int j=0;j<3;j++)
            nowx[sta[i][j]]=i,nowy[sta[i][j]]=j;
    for(int i=1;i<9;i++)
            sum+=(abs(aimx[i]-nowx[i])+abs(aimy[i]-nowy[i]));
    return sum;
}
void Astar(int nowstep,int Step,int px,int py) {
    if(flag||nowstep>Step) return;
    int H=Guess();
    if(H==0) {flag=true;return;}
    if(H+nowstep>Step) return;
    for(int i=0;i<4;i++) {
        int x=px+dx[i],y=py+dy[i];
        if(x<0||y<0||x>2||y>2) continue;
        swap(sta[x][y],sta[px][py]);
        Astar(nowstep+1,Step,x,y);
        swap(sta[x][y],sta[px][py]);
    }
    return;
}
int main() {
    for(int i=0;i<3;i++)
        for(int j=0;j<3;j++) {
            char c;
            scanf("%c",&c);
            sta[i][j]=c-‘0‘;
            if(sta[i][j]==0) px=i,py=j;
        }
    while(!flag) Step++,Astar(0,Step,px,py);
    printf("%d",Step);
    return 0;
}

  

洛谷【P1379】八数码难题

标签:href   tps   i++   blog   step   ref   ret   测试   nbsp   

原文地址:http://www.cnblogs.com/NuclearSubmarines/p/6947254.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!