UVa 10085-The most distant state(BFS,Eight).cpp

来源:互联网 发布:网络社交软件怎么做 编辑:程序博客网 时间:2024/06/03 11:48

八数码问题,参见lrj程序

#include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> #include <stack> #include <queue> #include <iostream> #include <algorithm>  using namespace std;  #define MAXN  500000 #define INF 1e8 #define NEGINF -1e8  int final[9]; int dx[] = {-1,1,0,0},dy[] = {0,0,-1,1}; int st[MAXN][9]; int fa[MAXN]; char dir[MAXN]; const int HASHSIZE = 1000003; int head[HASHSIZE], next[MAXN]; int dis[MAXN]; int maxDis,pos;  typedef int State[9];  void init_lookup_table() { memset(head, 0, sizeof(head)); }  inline int hash(State &s) { int v = 0; for( int i = 0; i < 9; i++ ) {  v = v * 10 + s[i]; } return v % HASHSIZE;  }  int try_to_insert(int s) {   int h = hash(st[s]);   int u = head[h];   while(u) {     if(memcmp(st[u], st[s], sizeof(st[s])) == 0) return 0;     u = next[u];   }   next[s] = head[h];   head[h] = s;   return 1; }   void bfs() { init_lookup_table(); dis[0] = 0; int i,j; int front = 0,rear = 1; while( front < rear) { State& u = st[front]; if( dis[front] >= maxDis ) { maxDis = dis[front]; memcpy(final,u,sizeof(final)); pos = front; }  int a; for( i = 0; i < 9; i++ ) if( u[i] == 0 ) { a = i; break; }  int b = a % 3; a /= 3; int x,y; for( i = 0; i < 4; i++ ) { x = a + dx[i]; y = b + dy[i]; if( x >= 0 && x < 3 && y >= 0 && y < 3 ) { State& v = st[rear]; memcpy(v,u,sizeof(u)); v[3*a + b] = u[3*x + y]; v[3*x+y] = 0; if(try_to_insert(rear)) { if( i == 0 ) dir[rear] = 'U'; if( i == 1 ) dir[rear] = 'D'; if( i == 2 ) dir[rear] = 'L'; if( i == 3 ) dir[rear] = 'R'; fa[rear] = front; dis[rear] = dis[front] + 1; rear++; } } } front++; }  }  void printInfo(int s) { if( fa[s] != s ) printInfo(fa[s]); else return; printf("%c",dir[s]); } int main() { #ifndef ONLINE_JUDGE freopen("data.in","r",stdin); //freopen("data.out","w",stdout); #endif  int ncase; int i,j,k; char str[100]; scanf("%d",&ncase); for( i= 1; i <= ncase; i++ ) { for( j = 0; j < 9; j++ ) scanf("%d",&st[0][j]); fa[0] = 0; maxDis = NEGINF; bfs(); //printf("%d\n",maxDis); printf("Puzzle #%d\n",i); for( j = 0; j < 3; j ++ ) { bool first = true; for( k = 0; k < 3; k++) { if( first ) { printf("%d",final[j*3+k]); first = false; } else printf(" %d",final[j*3+k]);  } printf("\n"); } printInfo(pos); printf("\n\n");   }  return 0; }  


原创粉丝点击