讨论 / 猥琐状压
2016zhangzhongyu 2017-09-15 19:24:18
点我顶贴 收藏 删除
#include<cstdio>

#include<cmath>

const int fx[4]={0,0,1,-1};//右左上下

const int fy[4]={1,-1,0,0};

const int calc[9]={1,7,49,343,2401,16807,117649,823543,5764801};

struct node{int x,y,d,a[3][3];} f[400000];

int map[3][3]={{1,2,3},{8,0,4},{7,6,5}};

bool bz[70000000];

int head=1,tail=1,ans=0;

char st[10];

int main()

{

int u=0,s=0;

scanf("%s",st);

for(int i=0;i<=2;i++)

for(int j=0;j<=2;j++)

{

f[1].a[i][j]=st[u]-48;

if(f[1].a[i][j]==0)

{

f[1].x=i;

f[1].y=j;

}

s+=f[1].a[i][j]*calc[u];

ans+=map[i][j]*calc[u++];

}

bz[s]=false;

f[1].d=0;

while(head<=tail)

{

for(int i=0;i<=3;i++)

{

int t1=f[head].x+fx[i],t2=f[head].y+fy[i];

if(t1<0||t1>2||t2<0||t2>2) continue;

tail++;

for(int j=0;j<=2;j++)

for(int k=0;k<=2;k++)

f[tail].a[j][k]=f[head].a[j][k];

int t=f[tail].a[t1][t2];

f[tail].a[t1][t2]=0;

f[tail].a[f[head].x][f[head].y]=t;

f[tail].x=t1;

f[tail].y=t2;

f[tail].d=f[head].d+1;

int u=0,s=0;

for(int j=0;j<=2;j++)

for(int k=0;k<=2;k++)

s+=f[tail].a[j][k]*calc[u++];

if(!bz[s]) bz[s]=true; else tail--;

if(s==ans)

{

printf("%d",f[tail].d);

return 0;

}

}

head++;

}

}

#1 ADOP@2017-09-20 21:59:37
回复 删除
比比看,谁更恶。

#include<cstdio>

#include<queue>

#include<cstdlib>

using namespace std;

char *viss=(char *)malloc(95341761);

const int nine[11]={1,9,81, 729,6561,59049,531441,4782969,43046721,387420489};

int h(const int ap[4][4]){

int ans=0;

for(int i=1;i<=3;i++)

for(int j=1;j<=3;j++){

ans+=nine[ 8-(i-1)*3-(j-1) ]*ap[i][j];

}

return ans;

}

void reset(int x,int ap[4][4]){

for(int i=3;i>0;i--)

for(int j=3;j>0;j--){

ap[i][j]=x%9;

x/=9;

}

}

#define pass(ha) (viss[(ha>>3)]|=(1<<(ha%8)));

#define meet(ha) ((bool)(viss[(ha>>3)]&(1<<(ha%8))))

class node{

public:

int hashs,walk,x,y;

node(int a,int b,int c,int d):hashs(a),walk(b),x(c),y(d){}

};

int a[4][4],b[4][4]={{0,0,0,0},{0,1,2,3},{0,8,0,4},{0,7,6,5}},beginx,beginy;

const int next_walk[4][2]={{0,1},{1,0},{-1,0},{0,-1}};

int main(void)

{

for(int i=1;i<=3;i++)

for(int j=1;j<=3;j++){

char ch=getchar();

while(ch>'9'||ch<'0')

ch=getchar();

a[i][j]=ch-'0';

if(a[i][j]==0)

beginx=i,beginy=j;

}

queue<node> q;

int tmps=h(a),end_hash=h(b);

q.push(node(tmps,0,beginx,beginy));

pass(tmps);

while(!q.empty()){

node x=q.front();

if(x.hashs==end_hash){

printf("%d",x.walk);

exit(0);

}

for(int k=0;k<4;k++){

reset(x.hashs,a);

int tx=x.x+next_walk[k][0],ty=x.y+next_walk[k][1];

if(tx<1||ty<1||tx>3||ty>3)

continue;

a[x.x][x.y]=a[tx][ty];

a[tx][ty]=0;

tmps=h(a);

if(meet(tmps)==false){

q.push(node(tmps,x.walk+1,tx,ty));

pass(tmps);

}

a[tx][ty]=a[x.x][x.y];

a[x.x][x.y]=0;

}

q.pop();

}

return 0;

}

查看更多回复
提交回复