T4WA90

题面:





我的代码:

#include<bits/stdc++.h>
#define I using
#define AK namespace
#define IOI std
#define i_ak return
#define ioi  0
I AK IOI;
int n,m,dx[]={0,1,0,-1},dy[]={1,0,-1,0};
char mapa[2005][2005];
struct node{
	int x,y;
}st,en;
int bfs(){
	queue<node>q;
	q.push({st.x,st.y});
	int vis[2005][2005];
	memset(vis,-1,sizeof vis);
	vis[st.x][st.y]=0;
	while(!q.empty()){
		node t=q.front();
		q.pop();
		if(t.x==en.x&&t.y==en.y)return vis[t.x][t.y];
		for(int i=0;i<4;i++){
			int nx=t.x+dx[i],ny=t.y+dy[i];
			if(nx>0&&nx<=n&&ny>0&&ny<=m&&vis[nx][ny]==-1&&mapa[nx][ny]!='#'){
				vis[nx][ny]=vis[t.x][t.y]+1;
				q.push({nx,ny});
			}
		}
	}
	return -1;
}
int main(){
	//freopen("","r",stdin);
	//freopen("","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>mapa[i][j];
			if(mapa[i][j]=='S'){
				st.x=i;
				st.y=j;
			}
			if(mapa[i][j]=='G'){
				en.x=i;
				en.y=j;
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(mapa[i][j]=='<')for(int k=1;k<=j;k++)if(mapa[i][k]=='.')mapa[i][k]='#';
			if(mapa[i][j]=='>')for(int k=j;k<=m;k++)if(mapa[i][k]=='.')mapa[i][k]='#';
			if(mapa[i][j]=='^')for(int k=1;k<=i;k++)if(mapa[k][j]=='.')mapa[k][j]='#';
			if(mapa[i][j]=='v')for(int k=i;k<=n;k++)if(mapa[k][j]=='.')mapa[k][j]='#';
		}
	}
	cout<<bfs();
	i_ak ioi;
}

WA90 的代码,我测的本地不输出?为什么在 xyd 会输出,并且为什么 90?

@王建力

这里应该不能只判断mapa[nx][ny]!='#',应该是mapa[nx][ny]=='.'

举一个反例:

3 6
..G...
>>><<<
...S..

实际上要输出-1,而你的程序输出3

@黄飞栋 e你能解决一下我的代码本地不输出的原因吗?

这个我也不太清楚

@黄飞栋 你这里确定是mapa[nx][ny]!='.'

确定是,因为<>这些符号本身也是视线范围内

@黄飞栋 但是你这样判断不可走路径里S和G也被算上了呀,这肯定不对吧

@黄飞栋 我考虑到了呀,代码里我也算上了呀,在for循环里面我就特殊的加上了

改成 (mapa[nx][ny]=='.'||mapa[nx][ny]=='S'||mapa[nx][ny]=='G')试试

@黄飞栋 等一下,我可能知道哪里错了,好像是for循环忘记特判了

那你能帮我看看我的吗?

@黄飞栋 看什么?等一下

@黄飞栋 等一下我之前的代码测试点6有问题,现在这是我的最新代码:

#include<bits/stdc++.h>
#define I using
#define AK namespace
#define IOI std
#define i_ak return
#define ioi  0
I AK IOI;
int n,m,dx[]={0,1,0,-1},dy[]={1,0,-1,0};
char mapa[2005][2005];
struct node{
	int x,y;
}st,en;
int bfs(){
	queue<node>q;
	q.push({st.x,st.y});
	int vis[2005][2005];
	memset(vis,-1,sizeof vis);
	vis[st.x][st.y]=0;
	while(!q.empty()){
		node t=q.front();
		q.pop();
		if(t.x==en.x&&t.y==en.y)return vis[t.x][t.y];
		for(int i=0;i<4;i++){
			int nx=t.x+dx[i],ny=t.y+dy[i];
			if(nx>0&&nx<=n&&ny>0&&ny<=m&&vis[nx][ny]==-1&&mapa[nx][ny]!='#'){
				vis[nx][ny]=vis[t.x][t.y]+1;
				q.push({nx,ny});
			}
		}
	}
	return -1;
}
int main(){
	//freopen("","r",stdin);
	//freopen("","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>mapa[i][j];
			if(mapa[i][j]=='S'){
				st.x=i;
				st.y=j;
			}
			if(mapa[i][j]=='G'){
				en.x=i;
				en.y=j;
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(mapa[i][j]=='<'){
				for(int k=1;k<j;k++)if(mapa[i][k]=='.')mapa[i][k]='#';
				mapa[i][j]='#';
			}
			if(mapa[i][j]=='>'){
				for(int k=j;k<m;k++)if(mapa[i][k]=='.')mapa[i][k]='#';
				mapa[i][j]='#';
			}
			if(mapa[i][j]=='^'){
				for(int k=1;k<i;k++)if(mapa[k][j]=='.')mapa[k][j]='#';
				mapa[i][j]='#';
			}
			if(mapa[i][j]=='v'){
				for(int k=i;k<n;k++)if(mapa[k][j]=='.')mapa[k][j]='#';
				mapa[i][j]='#';
			}
		}
	}
	cout<<bfs();
	i_ak ioi;
}

还是WA90 测试点6好了,但是测试点7有问题了 qwq

@黄飞栋 哦哦哦,脑抽了,

@黄飞栋 okAC了, @栗子酱 关帖

请不要那么频繁的@ 别人

@黄飞栋 o知道了,因为有些人不@不来,所以我习惯@