80分RE两个点求调
  • 板块P1189 SEARCH
  • 楼主aCBHa
  • 当前回复0
  • 已保存回复2
  • 发布时间2024/4/3 21:30
  • 上次更新2024/4/3 22:09:01
查看原帖
80分RE两个点求调
1033739
aCBHa楼主2024/4/3 21:30

代码

#include<bits/stdc++.h>
using namespace std;
int r,c,n,x,y,dir[1001][2],f[51][51][1001];
//dir方向,xy坐标
//f[i][j][k]指在第i行第j列第k个方向是否遍历过。
char mapc[51][51],dd[6];
//mpac地图,dd辅助输入
void dfs(int x,int y,int z)//意义同f
{
	if(f[x][y][z]||mapc[x][y]=='X'||x<1||x>r||y<1||y>c) return;
	f[x][y][z]=1;
	int xx=x,yy=y;
	if(z==n)
	{
		while(xx>=1&&xx<=r&&yy>=1&&yy<=c&&mapc[xx][yy]!='X')
			mapc[xx][yy]='*',xx+=dir[z][0],yy+=dir[z][1];
		return;
	}
//不能再改变方向,便一直走到底,标记所有点
	xx+=dir[z][0],yy+=dir[z][1];
//不改变方向
	dfs(xx,yy,z);
	xx=x+dir[z+1][0],yy=y+dir[z+1][1];
//改变方向
	dfs(xx,yy,z+1);
}
int main()
{
	//freopen("P1189_2.in","r",stdin);
	//freopen("1.out","w",stdout);
	cin>>r>>c;
	for(int i=1;i<=r;++i)
		for(int j=1;j<=c;++j)
		{
			cin>>mapc[i][j];
			if(mapc[i][j]=='*')
				x=i,y=j,mapc[i][j]='.';
		}
	cin>>n;
	for(int i=1;i<=n;++i)
	{
		cin>>dd;
		switch(dd[0])
		{
			case 'N':dir[i][0]=-1,dir[i][1]=0;break;
			case 'S':dir[i][0]=1,dir[i][1]=0;break;
			case 'W':dir[i][0]=0,dir[i][1]=-1;break;
			case 'E':dir[i][0]=0,dir[i][1]=1;break;
		}
//标记方向
	}
	f[x][y][1]=1,x+=dir[1][0],y+=dir[1][1];
//据题意至少要向第一个方向走一步
	dfs(x,y,1);
	for(int i=1;i<=r;++i)
	{
		for(int j=1;j<=c;++j)
			cout<<mapc[i][j];
		cout<<endl;
	}
	return 0;
}

结果

luogu上RE两个点,但是把一个点下载下来自己测却没有问题。有史以来见过最离谱的情况。

2024/4/3 21:30
加载中...