社区讨论

求助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 条回复,欢迎继续交流。

正在加载回复...