为啥A不了??
标程如下:【转载】
#include<iostream>
#include<cstdio>
#include<cmath>
#include<vector>
#include<cstring>
#include<queue>
#include<unordered_map>
#define IL inline
#define R register
#define I int
#define OP operator
#define CT const
#define FUCK friend
#define FO(i,a,b) for(I i=a;i<=b;++i)
#define fo(i,a,b) for( I i=a;i<b;++i)
#define ll long long
CT I goal = 123804765;
typedef bool QWQ;
using namespace std;
struct ED{
short a[3][3];
};
struct EE{
int v;
int id;
EE(I a=0,I b=0):v(a),id(b){}
};
struct D{
I x;
I y;
}dd[]={{0,1},{1,0},{-1,0},{0,-1}};
I d[10]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
I toint(ED x){
I a=0;
fo(i,0,9){
a+=x.a[i/3][i%3]*d[i];
}
return a;
}
ED toju(I x){
ED s;
fo(i,0,9){
s.a[i/3][i%3]=x/d[i]%10;
}
return s;
}
queue< EE >q;
unordered_map<I,I> mp;
I fir;
I main(){
scanf("%d",&fir);
q.push(EE(fir,0));
while(!q.empty()){
EE x=q.front();q.pop();
if(mp.count(x.v))continue;
mp[x.v]=1;
if(x.v==goal){
cout<<x.id<<endl;
return 0;
}else{
ED xx=toju(x.v);
fo(i,0,3){
fo(j,0,3){
if(xx.a[i][j]==0)
fo(k,0,4){
I fx,fy;
fx=i+dd[k].x;
fy=j+dd[k].y;
if(fx<0||fy<0||fx>=3||fy>=3)
{
continue;
}else{
ED xxxx=xx;
swap(xxxx.a[i][j],xxxx.a[fx][fy]);
I xxx=toint(xxxx);
q.push(EE(xxx,x.id+1));
}
}
}
}
}
}
return 0;
}
这个是对的,我的就不对了!!神奇!!!!!!
本人垃圾代码:
#include<bits/stdc++.h>
using namespace std;
struct sd{
int x,y;
int mmp[4][4];
}loc[500004];
int goal[4][4];
int p1,p2;
int z[500004];
int x,y;
int dirx[2]={1,-1};
int diry[2]={1,-1};
int goalx,goaly;
void init()
{
goalx=2;goaly=2;
char ch[14];
scanf("%s",ch);
loc[0].mmp[1][1]=ch[0]-48;
loc[0].mmp[1][2]=ch[1]-48;
loc[0].mmp[1][3]=ch[2]-48;
loc[0].mmp[2][1]=ch[3]-48;
loc[0].mmp[2][2]=ch[4]-48;
loc[0].mmp[2][3]=ch[5]-48;
loc[0].mmp[3][1]=ch[6]-48;
loc[0].mmp[3][2]=ch[7]-48;
loc[0].mmp[3][3]=ch[8]-48;
goal[1][1]=1;//123804765
goal[1][2]=2;
goal[1][3]=3;
goal[2][1]=8;
goal[2][2]=0;
goal[2][3]=4;
goal[3][1]=7;
goal[3][2]=6;
goal[3][3]=5;
for(int i=0;i<=8;++i)
{
if(ch[i]=='0')
{
x=i/3+1;
y=i%3+1;
}
}
}
bool judge(int k)
{
for(int i=1;i<=k;++i)
{
for(int j=1;j<=3;++j)
{
if(loc[k].mmp[i][j]!=goal[i][j])
return false;
}
}
return true;
}
void seach()
{
loc[0].x=x; loc[0].y=y;
int p1=0,p2=0;
while(p1<=p2)
{
for(int i=0;i<=1;++i)
{
if(loc[p1].x+dirx[i]>3||loc[p1].x+dirx[i]<=0) continue;
p2++;
for(int j=1;j<=3;++j)
{
for(int k=1;k<=3;++k)
{
loc[p2].mmp[j][k]=loc[p1].mmp[j][k];
}
}
z[p2]=z[p1]+1;
loc[p2].x=loc[p1].x+dirx[i];
loc[p2].y=loc[p1].y;
swap(loc[p2].mmp[loc[p1].x][loc[p1].y],loc[p2].mmp[loc[p2].x][loc[p2].y]);
if(loc[p2].x==goalx&&loc[p2].y==goaly)
{
if(judge(p2)) {
printf("%d",z[p2]);
exit(0);
}
}
}
for(int i=0;i<=1;++i)
{
if(loc[p1].y+diry[i]>3||loc[p1].y+diry[i]<=0) continue;
p2++;
for(int j=1;j<=3;++j)
{
for(int k=1;k<=3;++k)
{
loc[p2].mmp[j][k]=loc[p1].mmp[j][k];
}
}
z[p2]=z[p1]+1;
loc[p2].y=loc[p1].y+diry[i];
loc[p2].x=loc[p1].x;
swap(loc[p2].mmp[loc[p1].x][loc[p1].y],loc[p2].mmp[loc[p2].x][loc[p2].y]);
if(loc[p2].x==goalx&&loc[p2].y==goaly)
{
if(judge(p2)) {
printf("%d",z[p2]);
exit(0);
}
}
}
p1++;
}
}
int main()
{
init();
seach();
}
//283104765
厉害的大佬帮忙看一下,谢谢!!!!!!