竟然WA了三个点 求教!!!

#include<cstdio>
#include<cstring> 
#include<iostream>
#define MAXN 100010 

using namespace std;

int map[3][3],x,y,head,tail;

int _x[4]={0,1,0,-1};
int _y[4]={1,0,-1,0};

struct node {
    int m[3][3];
};
node e[MAXN];

char s[10];

int step[MAXN];

bool _hash[3733800],flag;

inline void _pre() {
    string ss="123804765";
    for(int i=0;i<9;i++) {
        map[x][y]=ss[i]-48;
        y++;
        if(y==3) x++,y=0;
    }
    x=0;y=0;
    return;
}

inline bool __hash() {
    int _Inr=0,k=1;
    for(int i=0;i<3;i++)
      for(int j=0;j<3;j++) {
        _Inr+=e[tail].m[i][j]*k;
        k*=7;
      }
    _Inr%=373899;
    if(!_hash[_Inr]) {
        _hash[_Inr]=true;
        return true;
    }
    return false;
}

inline bool pd(int i,int j) {
    return i>=0&&j>=0&&i<3&&j<3;
}

inline bool check() {
    for(int i=0;i<3;i++)
      for(int j=0;j<3;j++) 
        if(e[tail].m[i][j]!=map[i][j]) return false;
    return true;
}

inline void move(int p,int q) {
    int xx,yy; 
    for(int i=0;i<4;i++) {
        xx=p+_x[i];
        yy=q+_y[i];
        if(pd(xx,yy)) {
            for(int a=0;a<3;a++)
              for(int b=0;b<3;b++)
                e[tail].m[a][b]=e[head].m[a][b];
            swap(e[tail].m[p][q],e[tail].m[xx][yy]);
            step[tail]=step[head]+1;
            if(check()) {
                printf("%d\n",step[tail]);
                flag=true;
                return;
            }
            if(__hash()) tail++;
        }
    }
}

inline void search() {
    while(head<tail) {
        for(int i=0;i<3;i++)
          for(int j=0;j<3;j++) {
            if(e[head].m[i][j]==0) move(i,j);
            if(flag) return;
          }
        head++;
    }
}

int main() {
    _pre();
    scanf("%s",s);
    for(int i=0;i<strlen(s);i++) {
        e[0].m[x][y]=s[i]-48;
        y++;
        if(y==3) y=0,x++;
    }
    tail++;
    search();
    return 0;
}

0 条评论

目前还没有评论...

信息

ID
1360
难度
6
分类
搜索 | 搜索与剪枝 点击显示
标签
(无)
递交数
3851
已通过
922
通过率
24%
被复制
8
上传者