滑块

来源:互联网 发布:淘宝培训公司靠谱吗 编辑:程序博客网 时间:2024/04/30 12:47

题意(原题):
给出起始与目标两个3*3的矩阵,矩阵内数由0-8组成且互不相同。每次操作可以将0上下左右的任意数与0交换。求到达目标矩阵的最小步数。
思路(请先预习康托展开):
把每个状态进行康托展开成为一个数,随即宽搜即可。
代码:

#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>using namespace std;struct node{    int x,y,deep,a[4][4];    node()    {        x=y=deep=0;        memset(a,0,sizeof(a));    }}list[410000];int fx[]={0,-1,1,0,0};int fy[]={0,0,0,-1,1};int Ktx[100],jc[100];bool useAble[100],v[410000];int Kt(node x){    memset(useAble,true,sizeof(useAble));    for(int i=1;i<=3;i++)        for(int j=1;j<=3;j++)            Ktx[(i-1)*3+j]=x.a[i][j]+1;    int ans=0,cnt;    for(int i=1;i<=9;i++)    {        cnt=0;        for(int j=1;j<Ktx[i];j++)            if(useAble[j])                cnt++;        useAble[Ktx[i]]=false;        ans+=cnt*jc[9-i];    }    return ans+1;}void memsetjc(){    jc[0]=1;    for(int i=1;i<=9;i++)        jc[i]=jc[i-1]*i;}void swap(int &x,int &y){    int t=x;x=y;y=t;}int main(){    memsetjc();    int st,ed,head,tail;    node sxde,edNode;    for(int i=1;i<=3;i++)        for(int j=1;j<=3;j++)        {            scanf("%d",&sxde.a[i][j]);            if(sxde.a[i][j]==0)                sxde.x=i,sxde.y=j;        }    for(int i=1;i<=3;i++)        for(int j=1;j<=3;j++)        {            scanf("%d",&edNode.a[i][j]);            if(edNode.a[i][j]==0)                edNode.x=i,edNode.y=j;        }    st=Kt(sxde);ed=Kt(edNode);    head=1;tail=2;memset(v,true,sizeof(v));list[1]=sxde;    while(head<=tail)    {        node x=list[head];        for(int i=1;i<=4;i++)        {            node y=x;            y.x+=fx[i];y.y+=fy[i];y.deep=x.deep+1;            if(y.x<=3&&y.x>=1&&y.y<=3&&y.y>=1)            {                swap(y.a[y.x][y.y],y.a[x.x][x.y]);                int z=Kt(y);                if(v[z])                {                    if(z==ed)                    {                        printf("%d\n",y.deep);                        return 0;                    }                    v[z]=false;                    list[tail++]=y;                }            }        }        head++;    }    return 0;}                   
原创粉丝点击