@ComeIntoPower 那个是我反作弊用的。 附上源码及反作弊码:
#include <bits/stdc++.h>
#define in inline
using namespace std;
// lyd /-\|<|O|
const int end=123804765;
map<int,int> vis;
int d[4]={-3,-1,1,3};
int pow10[]={
1,10,100,1000,10000,100000,1000000,10000000,100000000
};
in int get(int x,int p)
{
return int(x/pow10[p-1])%10;
}
in int isup(int x)
{
return x<=3;
}
in int isdown(int x)
{
return x>=7;
}
in int isleft(int x)
{
return x%3==1;
}
in int isright(int x)
{
return x%3==0;
}
in int swap(int x,int a,int b)
{
int s=get(x,a),t=get(x,b);
x-=s*pow10[a-1]+t*pow10[b-1];
x+=s*pow10[b-1]+t*pow10[a-1];
return x;
}
in int row(int x)
{
return (x-1)/3;
}
in int col(int x)
{
return (x-1)%3;
}
in int f(int state)
{
int s[20],t[20];
memset(s,0,sizeof(s)),memset(t,0,sizeof(t));
int ans=0;
for (int i=1;i<=9;i++) s[get(state,i)]=i,t[get(end,i)]=i;
for (int i=1;i<=8;i++) ans+=abs(row(s[i])-row(t[i]))+abs(col(s[i])-col(t[i]));
return ans;
}
struct data
{
int s,w;
data () {}
data (int s,int w):s(s),w(w+f(s)) {}
bool operator < (const data &rhs) const
{
return w>rhs.w;
}
};
priority_queue<data> q;
int main()
{
int s;
cin>>s;
q.push(data(s,0));
vis.clear();
while (!q.empty())
{
int p;
data u=q.top();q.pop();
if (vis[u.s]) continue;
if (u.s==end)
{
cout<<u.w<<endl;
return 0;
}
vis[u.s]=1;
for (int i=1;i<=9;i++)
{
int x=get(u.s,i);
if (!x)
{
p=i;
break;
}
}
for (int i=0;i<4;i++)
{
if (i==0 && isup(p)) continue;
if (i==1 && isleft(p)) continue;
if (i==2 && isright(p)) continue;
if (i==3 && isdown(p)) continue;
int pp=p+d[i];
int t=swap(u.s,p,pp);
q.push(data(t,u.w-f(u.s)+1));
}
}
}
#include <bits/stdc++.h>
using namespace std;
int main()
{
char c=getchar();
while (c!='`')
{
if (c==',') printf(",");
else if (c==';') printf(";");
else putchar(c);
c=getchar();
}
return 0;
}