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

八数码问题增强版

时间:2020-05-24 09:57:25      阅读:47      评论:0      收藏:0      [点我收藏+]

标签:NPU   script   sample   solution   oid   i++   put   学业   cout   

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;
}

 

八数码问题增强版

标签:NPU   script   sample   solution   oid   i++   put   学业   cout   

原文地址:https://www.cnblogs.com/wzx-RS-STHN/p/12945681.html

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