八数码问题增强版

Posted wzx-rs-sthn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了八数码问题增强版相关的知识,希望对你有一定的参考价值。

Description

    三行三列的数组,其元素值为0至8的数。现有如下的变换规则:

    1: 将0与上面一行元素对换

    2:将0与下面一行元素对换

    3:将0与左面一行元素对换

    4:将0与右面一行元素对换

    如果已知一个三行三列元素的初始情况,问最少需几次变换,能变换为指定的一种情况?

Input

包括六行的数据,每行有三个以空格分隔的数字。 前三行为原始状态 后三行为目标状态

Output

若能在20次以内(包括20)变换得到目标状态的数组,输出最少的变换次数; 
若不能在20次以内(包括20)变换得到目标状态的数组,输出No solution!

Sample Input

0 4 8
2 6 3
1 7 5
0 2 3
1 8 4
7 6 5

Sample Output

10

学业问题下周完善

#include<bits/stdc++.h>
int ans[4][4],a[4][4],flag,k;
int bx[4]={0,1,-1,0};
int by[4]={1,0,0,-1};
using namespace std;
int check()
{
    for(int i=1;i<=3;++i)
    for(int j=1;j<=3;++j)
    if(ans[i][j]!=a[i][j])return 0;
    return 1;
}
int test(int step)
{
    int t=0;
    for(int i=1;i<=3;++i)
    for(int j=1;j<=3;++j)
    if(ans[i][j]!=a[i][j])
    { if(++t+step>k) return 0;}
    return 1;
}
void A_star(int step,int x,int y,int pre)
{
    if(step==k){ if(check())flag=1; return;}
    if(flag) return;
    if(step>k)return;
    if(step>20)return;
    for(int i=0;i<4;++i)
    {
        int nx=x+bx[i],ny=y+by[i];
        if(nx<1||nx>3||ny<1||ny>3||pre+i==3) continue;
        swap(a[x][y],a[nx][ny]);
        if(test(step)&&!flag) 
            A_star(step+1,nx,ny,i);
        swap(a[x][y],a[nx][ny]);
    }
}
int main()
{
    int x,y;
    for(int i=1;i<=3;i++)
    for(int j=1;j<=3;j++)
    {
        cin>>a[i][j];
        if(a[i][j]==0)
            x=i,y=j;
    }
    for(int i=1;i<=3;i++)
    for(int j=1;j<=3;j++)
        cin>>ans[i][j];
    if(check()){cout<<0;return 0;}
    while(++k)
    {
        A_star(0,x,y,-1);
        if(k>20){cout<<"No solution!";return 0;}
        if(flag){cout<<k;break;}
    }
    return 0;
}

 

以上是关于八数码问题增强版的主要内容,如果未能解决你的问题,请参考以下文章

八数码问题强化版:十五数码问题idA*版本

八数码(map版)

9018:1368八数码

求八数码问题算法,并说明下该算法优缺点,要算法,不是源代码(可以没有)。

八数码问题算法,谁有?

A*算法求解八数码难题(python实现)