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; }
- UVa 10085-The most distant state(BFS,Eight).cpp
- uva 10085 - The most distant state bfs+map
- UVA - 10085 The most distant state(bfs+hash)
- uva 10085 The most distant state(BFS + HASH)
- uva 10085 10085 - The most distant state
- UVA 10085 - The most distant state
- uva 10085 - The most distant state
- UVa 10085 - The most distant state
- UVA 10085 - The most distant state
- uva 10085-The most distant state
- UVa:10085 The most distant state
- uva 10085 The most distant state
- uva:10085 - The most distant state
- UVa 10085 - The Most Distant State
- uva 10085 The most distant state
- uva 10085The most distant state
- UVA 10085 The most distant state
- UVA - 10085 The most distant state
- QT creator 环境 qt学习笔记第一章
- 无法创建大小为xxxx的行,该值大于允许的最大值8060
- 非对称加密
- css-多行文字固定高度垂直居中(ie6.7.8.9 chrome ff)
- 一个很好的讲解xmpp和bosh的教程
- UVa 10085-The most distant state(BFS,Eight).cpp
- 多媒体文件格式分析
- 业务逻辑处理顺序
- 寻址方式
- 敏捷开发“松结对编程”系列之十二:L型代码结构(质量篇之一)
- 汇编程序的组成
- 任正非在2012实验室的讲话
- 成都立方体科技--实习--第一天
- gcc使用指南