洛谷日报历年目录
  • 板块学术版
  • 楼主洛谷
  • 当前回复13917
  • 已保存回复13949
  • 发布时间2018/7/3 12:07
  • 上次更新2025/3/15 16:07:30
查看原帖
洛谷日报历年目录
3
洛谷楼主2018/7/3 04:07
2018/7/3 04:07
184080
LIFE_IS_FANTASTIC2019/3/12 12:58

~~_emmm _ ~~

2019/3/12 12:58
107935
Thomasguo6662019/3/12 13:23

@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;
}
2019/3/12 13:23
107935
Thomasguo6662019/3/12 13:32

(亲测可AC)

2019/3/12 13:32
125665
封禁用户2019/3/13 05:23
2019/3/13 05:23
125665
封禁用户2019/3/13 05:26

@Black_white_tony 我倒是可以写一个

2019/3/13 05:26
80937
天才byt2019/3/13 05:42

@L_T_F_ zici啊

2019/3/13 05:42
125665
封禁用户2019/3/13 05:44

@Black_white_tony zici是支持吗。。

2019/3/13 05:44
80937
天才byt2019/3/13 05:54

@L_T_F_ 兹词啊~~

2019/3/13 05:54