记录编号 42719 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 空格游戏 最终得分 100
用户昵称 GravatarluishenSTL没优化就成渣 是否通过 通过
代码语言 C++ 运行时间 0.840 s
提交时间 2012-09-28 11:05:29 内存使用 3.13 MiB
显示代码纯文本
#include<map>
#include<queue>
#include<string>
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;

typedef struct point{
   int x,y;
}point;

typedef struct node{
   string s;
   int step;
   point p[4];
   point pos[50];
}node;

node start;
string target;

void
output(string str){
   for(int i=0; i<4; i++) {
      for(int j=0; j<=7; j++) printf("%3d",str[i*8+j]);
      printf("\n");
   }

}

void
solve(){
   map<string,bool> m;
   map<string,bool>::iterator it;

   m[ start.s ] = true;



     start.step=0;
     node now,next;
     queue <node> q; q.push(start);
     int cnt=1;
     while(!q.empty()) {
          now = q.front(); q.pop();
          if(now.s==target) {
              printf("%d\n",now.step); return ;
          }
          for(int i=0; i<4; i++) {
              next = now; ++next.step;
              point &gap = next.p[i];
              int num = next.s[ gap.x * 8 + gap.y -1 ]; // gap 左边的数字
              if(num%10==7 || num==0) continue;
              int suc = num+1;

              point &sucp = next.pos[ suc ];
              //将gap与后驱交换位置
              swap(next.s[ gap.x * 8 + gap.y ],next.s[ sucp.x*8 + sucp.y ]);

              // 将gap的坐标与 后驱的坐标交换
              swap(next.p[i],sucp);
              it = m.find(next.s);
              if(it==m.end())  {
                  m[ next.s ] = true;
                  q.push(next);
              }
          }
     }
     puts("-1");
}

int main(){
  freopen("gap.in","r",stdin);
  freopen("gap.out","w",stdout);
  target="";
  for(int i=1; i<=4; i++) {
       for(int j=1; j<=7; j++) target+= char(i*10+j); target+=char(0);
  }


  int t=1;  //scanf("%d",&t);
  while(t--) {
      int a[5][8];  memset(a,0,sizeof(a));
      start.s="";
      for(int i=0; i<4; i++) for(int j=1; j<=7; j++) {
           scanf("%d",&a[i][j]);
           for(int k=1; k<=4; k++) {
               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;
           }
      }

      for(int i=0; i<4; i++) for(int j=0; j<8; j++) {
          point tmp; tmp.x=i; tmp.y=j;
          if(a[i][j]) start.pos[ a[i][j] ]=tmp;
          start.s+=char(a[i][j]);
      }
      solve();
  } // end while
  return 0;
}