社区讨论
悬赏求条·2关,有部分注释
P10485Bloxorz I参与者 1已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mjrzpedq
- 此快照首次捕获于
- 2025/12/30 10:50 2 个月前
- 此快照最后确认于
- 2025/12/30 11:29 2 个月前
球球了。
CPP#include<bits/stdc++.h>
// #define int long long
#define I cout<<"Impossible";
using namespace std;
const int N=510,INF=INT_MAX;
struct tt{
int x,y,xx,yy,cnt,d;
// d=1/2
// x,y,xx,yy坐标
// cnt答案
};
int n,m,x,y,xx,yy,xxx,yyy,d,ans;
map<pair<int,int>,map<pair<int,int>,bool>> mp;
// 标记按行小大列小大排序
char a[N][N];
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
void Clear(){
mp.clear();
x=-1;
y=-1;
xx=-1;
yy=-1;
xxx=-1;
yyy=-1;
ans=INF;
}
void bfs(){
if(x>xx){
swap(x,xx);
swap(y,yy);
}
else if(x==xx){
if(y>yy){
swap(y,yy);
}
}
queue<tt> q;
q.push({x,y,xx,yy,0,d});
mp[{x,y}][{xx,yy}]=1;
// 坐标-1为没有
while(!q.empty()){
tt t=q.front();
q.pop();
if(t.xx==xxx&&t.yy==yyy&&t.x==-1&&t.y==-1){
ans=t.cnt;
return;
}
if(t.d==1){
for(int i=0;i<4;i++){
int sx=t.xx+dx[i],sy=t.yy+dy[i],sxx=t.xx+dx[i]*2,syy=t.yy+dy[i]*2;
if(sx>sxx){
swap(sx,sxx);
swap(sy,syy);
}
else if(sx==sxx){
if(sy>syy){
swap(sy,syy);
}
}
if(sx>=1&&sx<=n&&sy>=1&&sy<=m&&sxx>=1&&sxx<=n&&syy>=1&&syy<=m&&!(a[sx][sy]=='#'&&a[sxx][syy]=='#')&&mp[{sx,sy}][{sxx,syy}]==0){
mp[{sx,sy}][{sxx,syy}]=1;
q.push({sx,sy,sxx,syy,t.cnt+1,2});
}
}
}
else{
if(t.x==t.xx){
// 横
int sy=t.y-1;
if(sy>=1&&sy<=m&&mp[{-1,-1}][{t.x,sy}]==0&&a[t.x][sy]!='#'&&a[t.x][sy]!='E'){
mp[{-1,-1}][{t.x,sy}]=1;
q.push({-1,-1,t.x,sy,t.cnt+1,1});
}
sy=t.yy+1;
if(sy>=1&&sy<=m&&mp[{-1,-1}][{t.x,sy}]==0&&a[t.x][sy]!='#'&&a[t.x][sy]!='E'){
mp[{-1,-1}][{t.x,sy}]=1;
q.push({-1,-1,t.x,sy,t.cnt+1,1});
}
int sx=t.x-1;
if(sx>=1&&sx<=n&&mp[{sx,t.y}][{sx,t.yy}]==0&&!(a[sx][t.y]==a[sx][t.yy]&&a[sx][t.y]=='#')){
mp[{sx,t.y}][{sx,t.yy}]=1;
q.push({sx,t.y,sx,t.yy,t.cnt+1,2});
}
sx=t.x+1;
if(sx>=1&&sx<=n&&mp[{sx,t.y}][{sx,t.yy}]==0&&!(a[sx][t.y]==a[sx][t.yy]&&a[sx][t.y]=='#')){
mp[{sx,t.y}][{sx,t.yy}]=1;
q.push({sx,t.y,sx,t.yy,t.cnt+1,2});
}
}
else{
// 竖
/*
X
X
___
/__/| ______
| || /_____/|
|__|/ |_____|/
*/
int sx=t.xx+1;
if(sx>=1&&sx<=n&&mp[{-1,-1}][{sx,t.y}]==0&&a[sx][t.y]!='#'&&a[sx][t.y]!='E'){
mp[{-1,-1}][{sx,t.y}]=1;
q.push({-1,-1,sx,t.y,t.cnt+1,1});
}
sx=t.xx-1;
if(sx>=1&&sx<=n&&mp[{-1,-1}][{sx,t.y}]==0&&a[sx][t.y]!='#'&&a[sx][t.y]!='E'){
mp[{-1,-1}][{sx,t.y}]=1;
q.push({-1,-1,sx,t.y,t.cnt+1,1});
}
int sy=t.y-1;
if(sy>=1&&sy<=m&&mp[{t.x,sy}][{t.xx,sy}]==0&&!(a[t.x][sy]==a[t.xx][sy]&&a[t.x][sy]=='#')){
mp[{t.x,sy}][{t.xx,sy}]=1;
q.push({t.x,sy,t.xx,sy,t.cnt+1,2});
}
sy=t.y+1;
if(sy>=1&&sy<=m&&mp[{t.x,sy}][{t.xx,sy}]==0&&!(a[t.x][sy]==a[t.xx][sy]&&a[t.x][sy]=='#')){
mp[{t.x,sy}][{t.xx,sy}]=1;
q.push({t.x,sy,t.xx,sy,t.cnt+1,2});
}
}
}
}
}
signed main(){
cin>>n>>m;
Clear();
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
if(a[i][j]=='O'){
xxx=i;
yyy=j;
}
else if(a[i][j]=='X'){
if(x==-1&&y==-1){
x=i;
y=j;
d=1;
}
else{
xx=i;
yy=j;
d=2;
}
}
}
}
// cout<<x<<" "<<y<<"\n"<<xx<<" "<<yy<<"\n"<<xxx<<" "<<yyy<<"\n"<<d;
bfs();
if(ans==INF){
I;
}
else{
cout<<ans;
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...