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 黑白棋游戏的主要内容,如果未能解决你的问题,请参考以下文章

简单的黑白棋游戏

HTML5 实现黑白棋游戏|附代码

手把手教你实战开发黑白棋实时对战游戏

黑白棋游戏

C语言零基础项目:黑白棋游戏!详细思路+源码分享

手把手教你实战开发黑白棋实时对战游戏