luogu_P1225 Reversi game

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>

#define ri register int
#define u int

using std::string;
using std::cin;
using std::pow;

namespace all {

u st,ed;

ug [1000001] fa [65555] n [65555] years [65555];

u _a[5][5];

void dfs(const u &x) {
if(!fa[x]) {
return;
}
dfs(fa[x]);
printf("%d\n",ans[x]);
}

u make() {
u _re(0);
for(ri i(1); i<=4; ++i) {
for(ri j(1); j<=4; ++j) {
_re=(_re<<1)+_a[i][j];
}
}
return _re;
}

void bfs() {
u l(0),r(0);
q[++r]=st;
ans[st]=1;
while(l+1<=r) {
u _x(q[++l]);
if(_x==ed) {
printf("%d\n",n[_x]);
dfs(_x);
exit(0);
}
u rest(_x);
for(ri i(1); i<=4; ++i) {
for(ri j(1); j<=4; ++j) {
if(pow(2,(4-i)*4+(4-j))<=rest) {
_a[i][j]=1;
rest-=pow(2,(4-i)*4+(4-j));
}
else _a[i][j]=0;
//printf("%d ",_a[i][j]);
}//printf("\n");
}
for(ri i(1); i<=4; ++i) {
for(ri j(1); j<=4; ++j) {
if(i+1<=4) {
std::swap(_a[i+1][j],_a[i][j]);
u _y(make());
if(!ans[_y]) {
q[++r]=_y;
n[_y]=n[_x]+1;
fa[_y]=_x;
ans[_y]=i*1000+j*100+(i+1)*10+j;
}
std::swap(_a[i+1][j],_a[i][j]);
}
if(j+1<=4) {
std::swap(_a[i][j+1],_a[i][j]);
u _y(make());
if(!ans[_y]) {
q[++r]=_y;
n[_y]=n[_x]+1;
fa[_y]=_x;
ans[_y]=i*1000+j*100+i*10+j+1;
}
std::swap(_a[i][j+1],_a[i][j]);
}
}
}
}
}

inline void solve() {
string _s;
for(ri i(1); i<=4; ++i) {
cin>>_s;
for(ri j(0); j<=3; ++j) {
st=(st<<1)+_s[j]-'0';
}
}
for(ri i(1); i<=4; ++i) {
cin>>_s;
for(ri j(0); j<=3; ++j) {
ed=(ed<<1)+_s[j]-'0';
}
}
bfs();
}

}

int main () {

//freopen("x.txt","r",stdin);
all::solve();

}

Guess you like

Origin www.cnblogs.com/ling-zhi/p/11732169.html