tjut 3567
来源:互联网 发布:centos rm 恢复 编辑:程序博客网 时间:2024/06/10 01:57
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <queue> #include <stack> #include <string> using namespace std; struct node { int x,y; char map[5][5]; node() {} node(char *s) { int i,j; int xx = 0,yy = 0; for(i = 0; i<strlen(s); i++) { map[xx][yy] = s[i]; if(s[i] == 'X') { x = xx; y = yy; } yy++; if(yy == 3) { xx++; yy = 0; } } } }; node s; char str[20]; int num[20],hash[10]; bool vis[500000]; int pre[10][500000],ans[10][500000]; int to[4][2] = {1,0,0,-1,0,1,-1,0}; char way[10] = "dlru"; int solve(node a)//康拓 { int i,j,k,cnt,ans = 0; int b[20]; for(i = 0; i<3; i++) { for(j = 0; j<3; j++) { b[3*i+j] = a.map[i][j]; cnt = 0; for(k = 3*i+j-1; k>=0; k--) { if(b[k]>b[3*i+j]) cnt++; } ans+=hash[3*i+j]*cnt; } } return ans; } void bfs(int p) { memset(pre[p],-1,sizeof(pre[p])); memset(vis,false,sizeof(vis)); node a,next; queue<node> Q; Q.push(s); vis[solve(s)] = true; while(!Q.empty()) { a = Q.front(); Q.pop(); int sa = solve(a); for(int i = 0; i<4; i++) { next = a; next.x+=to[i][0]; next.y+=to[i][1]; if(next.x<0 || next.x>2 || next.y<0 || next.y>2) continue; next.map[a.x][a.y] = next.map[next.x][next.y]; next.map[next.x][next.y] = 'X'; int sb = solve(next); if(vis[sb]) continue; vis[sb] = true; pre[p][sb] = sa; ans[p][sb] = way[i]; Q.push(next); } } } int main() { int t,i,j,k,cas = 1; hash[0] = 1; for(i = 1; i<10; i++) hash[i] = hash[i-1]*i; s = node("X12345678"); bfs(0); s = node("1X2345678"); bfs(1); s = node("12X345678"); bfs(2); s = node("123X45678"); bfs(3); s = node("1234X5678"); bfs(4); s = node("12345X678"); bfs(5); s = node("123456X78"); bfs(6); s = node("1234567X8"); bfs(7); s = node("12345678X"); bfs(8); scanf("%d",&t); while(t--) { scanf("%s",str); int p; for(i = 0,j = 0; i<9; i++)//保存位置,因为前面预处理的都是位置 { if(str[i]=='X') p = i; else num[str[i]-'0'] = j++; } scanf("%s",str); for(i = 0; i<9; i++)//求出目标状态每个数在原状态的位置 { if(str[i]=='X') continue; str[i] = num[str[i]-'0']+'1'; } s = node(str);//由目标态逆推到初始态 int sum = solve(s); string ss=""; while(sum!=-1) { ss+=ans[p][sum]; sum = pre[p][sum]; } printf("Case %d: %d\n",cas++,ss.size()-1); for(i = ss.size()-2; i>=0; i--)//由于方案是逆推,输出也要逆推 printf("%c",ss[i]); printf("\n"); } return 0; }
0 0
- tjut 3567
- tjut 5289
- tjut 5288
- tjut 5294
- tjut 2586
- tjut 5296
- tjut 5297
- tjut 5299
- tjut 5384
- tjut 5387
- tjut 5386
- tjut 5381
- tjut 5400
- tjut 5399
- tjut 5396
- tjut 5398
- tjut 5412
- tjut 5410
- datatables 初始化实例
- 快速排序(重点)
- 去掉listview中item之间的横线以及设置listview的背景色
- c++中的类型萃取
- 会议如何进行网络直播
- tjut 3567
- Linux进程间通信(三)
- Odd Even Linked List
- 第四周《C语言及程序设计》实践项目20 经典:查找的艺术
- 【搭建开发环境】android Studio-[Could not find com.android.support:multidex:1.0.1]
- myFirstBlog
- jquery 中的回调函数
- Bash游戏
- 第二周 项目2 程序的多文件组成 (c++)