社区讨论
求助QAQ
SP120 SOLIT - Solitaire参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lzf7sd3n
- 此快照首次捕获于
- 2024/08/04 15:01 2 年前
- 此快照最后确认于
- 2024/08/04 16:33 2 年前
复建时被这道题卡住了,在UVA提交的时候出现了RE,但是没找到到错误在哪QAQ
解题思路就是跑一个折半搜索,在搜索时同时记录一下到达某一个状态所用的步数。
代码如下:
CPP#include<bits/stdc++.h>
using namespace std;
const int dx[]={1,-1,0,0},dy[]={0,0,1,-1};
int mp[10][10];
map<string,pair<int,int> >vis;
struct node{
int cx[4],cy[4];
int step;
}cur,nxt,fin;
bool check(int k,int t)
{
for(int i=1;i<=8;++i)
for(int j=1;j<=8;++j)mp[i][j]=0;
for(int i=0;i<4;++i)mp[nxt.cx[i]][nxt.cy[i]]=1;
string s="";
for(int i=1;i<=8;++i)
for(int j=1;j<=8;++j)s+=char(mp[i][j]+'0');
if(vis[s].first==k)return false;
if(vis[s].first==0)vis[s]=make_pair(k,t);
return true;
}
bool judge()
{
for(int i=0;i<4;++i)
if(!mp[fin.cx[i]][fin.cy[i]])return false;
return true;
}
void bfs1()
{
queue<node>q1;
cur.step=0;
q1.push(cur);
check(1,0);
while(!q1.empty())
{
cur=q1.front();
q1.pop();
if(cur.step>4)return;
for(int i=1;i<=8;++i)
for(int j=1;j<=8;++j)mp[i][j]=0;
for(int i=0;i<4;++i)mp[cur.cx[i]][cur.cy[i]]=1;
for(int i=0;i<4;++i)
{
int tmpx=cur.cx[i],tmpy=cur.cy[i];
for(int j=0;j<4;++j)
{
nxt=cur;
int nx=tmpx+dx[j],ny=tmpy+dy[j];
if(nx<1||nx>8||ny<1||ny>8)continue;
if(mp[nx][ny])
{
for(int k=0;k<4;++k)
{
nxt=cur;
int nnx=nx+dx[k],nny=ny+dy[k];
if(nnx<1||nnx>8||nny<1||nny>8)continue;
if(nnx==tmpx&&nny==tmpy)continue;
nxt.cx[i]=nnx;nxt.cy[i]=nny;
if(!check(1,cur.step+1))continue;
++nxt.step;
if(nxt.step<=4)q1.push(nxt);
}
}
else
{
nxt.cx[i]=nx;nxt.cy[i]=ny;
if(!check(1,cur.step+1))continue;
++nxt.step;
if(nxt.step<=4)q1.push(nxt);
}
}
}
}
}
bool bfs2()
{
queue<node>q1;
fin.step=0;
q1.push(fin);
check(2,0);
while(!q1.empty())
{
cur=q1.front();
q1.pop();
if(cur.step>4)continue;
for(int i=1;i<=8;++i)
for(int j=1;j<=8;++j)mp[i][j]=0;
for(int i=0;i<4;++i)mp[cur.cx[i]][cur.cy[i]]=1;
string s="";
for(int i=1;i<=8;++i)
for(int j=1;j<=8;++j)s+=char(mp[i][j]+'0');
if(vis[s].first==1&&vis[s].second+cur.step-1<=8)return true;
for(int i=0;i<4;++i)
{
int tmpx=cur.cx[i],tmpy=cur.cy[i];
for(int j=0;j<4;++j)
{
nxt=cur;
int nx=tmpx+dx[j],ny=tmpy+dy[j];
if(nx<1||nx>8||ny<1||ny>8)continue;
if(mp[nx][ny])
{
for(int k=0;k<4;++k)
{
nxt=cur;
int nnx=nx+dx[k],nny=ny+dy[k];
if(nnx<1||nnx>8||nny<1||nny>8)continue;
if(nnx==tmpx&&nny==tmpy)continue;
nxt.cx[i]=nnx;nxt.cy[i]=nny;
if(!check(2,cur.step+1))continue;
++nxt.step;
if(nxt.step<=8)q1.push(nxt);
}
}
else
{
nxt.cx[i]=nx;nxt.cy[i]=ny;
if(!check(2,cur.step+1))continue;
++nxt.step;
if(nxt.step<=8)q1.push(nxt);
}
}
}
}
return false;
}
void solve()
{
vis.clear();
for(int i=0;i<4;++i)cin>>cur.cx[i]>>cur.cy[i];
for(int i=0;i<4;++i)cin>>fin.cx[i]>>fin.cy[i];
bfs1();
if(bfs2())cout<<"YES\n";
else cout<<"NO\n";
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T=1;
cin>>T;
while(T--)
{
solve();
}
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...