描述:题意是求从这个图到最远图之间的路径,再把最远图输出来就可以了,不过需要用到哈希判重,要注意一点,最远图只是路径相比较,如果存在路径相同的最远图,输出任何一个最远图都行
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define N 362885
typedef int State [9];
typedef struct
{
State goal;
char str[1000];
int sum;
} Road;
Road road[N];
State fact,num;
int count,n,m,flag[N];
int vis[5][2]= {{0,-1},{0,1},{-1,0},{1,0}};
char v[5]= {'L','R','U','D'};
void init_look_table()
{
fact[0]=1;
for(int i=1; i<9; i++) fact[i]=fact[i-1]*i;
}
bool try_to_insert(int cur)
{
int code =0;
for(int i=0; i<9; i++)
{
int cnt=0;
for(int j=i+1; j<9; j++)
if(road[cur].goal[j]<road[cur].goal[i]) cnt++;
code+=fact[8-i]*cnt;
}
if(flag[code]) return 0;
else flag[code]=1;
return 1;
}
void bfs()
{
int front=count=n=0,last=1;
memset(flag,0,sizeof(flag));
while(front<last)
{
Road& s=road[front];
int z=0;
for(; z<9; z++)if(!s.goal[z]) break;
int x=z/3,y=z%3;
for(int d=0; d<4; d++)
{
int newx=x+vis[d][0];
int newy=y+vis[d][1];
int newz=newx*3+newy;
if(newx<3&&newx>=0&&newy>=0&&newy<3)
{
s.str[s.sum]=v[d];
Road& t=road[last];
memcpy(&t,&s,sizeof(s));
t.goal[newz]=s.goal[z];
t.goal[z]=s.goal[newz];
t.sum++;
if(try_to_insert(last))
{
last++;
if(t.sum>count)
{
count=t.sum;
n=last-1;
}
}
}
}
front++;
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("a.txt","r",stdin);
#endif
init_look_table();
int c=0,a;
scanf("%d", &a);
while(c<a)
{
for(int i=0; i<9; i++) scanf("%d",&road[0].goal[i]);
road[0].sum=0;
printf("Puzzle #%d\n",++c);
bfs();
for(int i=0; i<3; i++)
printf("%d %d %d\n",road[n].goal[i*3],road[n].goal[i*3+1],road[n].goal[i*3+2]);
for(int i=0;i<road[n].sum;i++) printf("%c",road[n].str[i]);
printf("\n");
}
return 0;
}
10085 - The most distant state
最新推荐文章于 2022-03-15 00:02:19 发布