记录编号 42719 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 空格游戏 最终得分 100
用户昵称 GravatarluishenSTL没优化就成渣 是否通过 通过
代码语言 C++ 运行时间 0.840 s
提交时间 2012-09-28 11:05:29 内存使用 3.13 MiB
显示代码纯文本
  1. #include<map>
  2. #include<queue>
  3. #include<string>
  4. #include<cstring>
  5. #include<cstdio>
  6. #include<iostream>
  7. using namespace std;
  8.  
  9. typedef struct point{
  10. int x,y;
  11. }point;
  12.  
  13. typedef struct node{
  14. string s;
  15. int step;
  16. point p[4];
  17. point pos[50];
  18. }node;
  19.  
  20. node start;
  21. string target;
  22.  
  23. void
  24. output(string str){
  25. for(int i=0; i<4; i++) {
  26. for(int j=0; j<=7; j++) printf("%3d",str[i*8+j]);
  27. printf("\n");
  28. }
  29.  
  30. }
  31.  
  32. void
  33. solve(){
  34. map<string,bool> m;
  35. map<string,bool>::iterator it;
  36.  
  37. m[ start.s ] = true;
  38.  
  39.  
  40.  
  41. start.step=0;
  42. node now,next;
  43. queue <node> q; q.push(start);
  44. int cnt=1;
  45. while(!q.empty()) {
  46. now = q.front(); q.pop();
  47. if(now.s==target) {
  48. printf("%d\n",now.step); return ;
  49. }
  50. for(int i=0; i<4; i++) {
  51. next = now; ++next.step;
  52. point &gap = next.p[i];
  53. int num = next.s[ gap.x * 8 + gap.y -1 ]; // gap 左边的数字
  54. if(num%10==7 || num==0) continue;
  55. int suc = num+1;
  56.  
  57. point &sucp = next.pos[ suc ];
  58. //将gap与后驱交换位置
  59. swap(next.s[ gap.x * 8 + gap.y ],next.s[ sucp.x*8 + sucp.y ]);
  60.  
  61. // 将gap的坐标与 后驱的坐标交换
  62. swap(next.p[i],sucp);
  63. it = m.find(next.s);
  64. if(it==m.end()) {
  65. m[ next.s ] = true;
  66. q.push(next);
  67. }
  68. }
  69. }
  70. puts("-1");
  71. }
  72.  
  73. int main(){
  74. freopen("gap.in","r",stdin);
  75. freopen("gap.out","w",stdout);
  76. target="";
  77. for(int i=1; i<=4; i++) {
  78. for(int j=1; j<=7; j++) target+= char(i*10+j); target+=char(0);
  79. }
  80.  
  81.  
  82. int t=1; //scanf("%d",&t);
  83. while(t--) {
  84. int a[5][8]; memset(a,0,sizeof(a));
  85. start.s="";
  86. for(int i=0; i<4; i++) for(int j=1; j<=7; j++) {
  87. scanf("%d",&a[i][j]);
  88. for(int k=1; k<=4; k++) {
  89. if(a[i][j]==k*10+1) swap(a[k-1][0],a[i][j]),start.p[k-1].x=i,start.p[k-1].y=j;
  90. }
  91. }
  92.  
  93. for(int i=0; i<4; i++) for(int j=0; j<8; j++) {
  94. point tmp; tmp.x=i; tmp.y=j;
  95. if(a[i][j]) start.pos[ a[i][j] ]=tmp;
  96. start.s+=char(a[i][j]);
  97. }
  98. solve();
  99. } // end while
  100. return 0;
  101. }