luogu_P1225 黑白棋游戏
Posted ling-zhi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu_P1225 黑白棋游戏相关的知识,希望对你有一定的参考价值。
#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;
u q[1000001],fa[65555],n[65555],ans[65555];
u _a[5][5];
void dfs(const u &x) {
if(!fa[x]) {
return;
}
dfs(fa[x]);
printf("%d
",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[_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("
");
}
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();
}
以上是关于luogu_P1225 黑白棋游戏的主要内容,如果未能解决你的问题,请参考以下文章