站外题求调(大佬们进来看一眼吧)
  • 板块灌水区
  • 楼主Continu
  • 当前回复9
  • 已保存回复9
  • 发布时间2023/10/6 10:05
  • 上次更新2023/11/2 15:20:14
查看原帖
站外题求调(大佬们进来看一眼吧)
217329
Continu楼主2023/10/6 10:05

原题看这里

下面是这位蒟蒻的代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<set>
using namespace std;
struct Queue
{
	int x;
	int y;
	int step;
}q[500];//队列
int head=1,tail=1;//队列指针 
 
const int xx[4]={0,-1,0,1};
const int yy[4]={1,0,-1,0};//上左下右
 
char t[25][25];		//原图 
bool book[25][25];	//标记 
int m,n,qx,qy,zx,zy;//矩阵大小,起终点坐标

void bfs(int x,int y)
{	
	while(head<tail)
	{
		if(t[zx][zy]=='*') break; //如果已经找到,退出 
		for(int i=0;i<4;i++)
		{
			int nx=q[head].x+xx[i];
			int ny=q[head].y+yy[i];//新点坐标
			if(nx==zx&&ny==zy){
				cout<<q[head].step+1<<endl;
				t[zx][zy]='*';		//特殊标记 
			}
			else if(nx>=0&&nx<m&&ny>=0&&ny<n&&t[nx][ny]=='.'&&book[nx][ny]==0)//判边判重 
			{
				q[tail].x=nx;
				q[tail].y=ny;
				q[tail].step=q[head].step+1;
				book[nx][ny]=1;
			}
		}
		head++;//队首出队 
	}
}
int main()
{
	while(scanf("%d %d",&m,&n))//据题意,不为0一直输入 
	{
		if(m==0&&n==0) break;
		for(int i=0;i<m;i++)
		{
			for(int j=0;j<n;j++)//坐标从0开始 
			{
				cin>>t[i][j];
				if(t[i][j]=='@'){	//找起点 
					qx=i;
					qy=j;
					t[i][j]='.';
				}
				else if(t[i][j]=='*'){ //找终点 
					zx=i;
					zy=j;
					t[i][j]='.';
				}
			}
		}
		cout<<qx<<" "<<qy<<" "<<zx<<" "<<zy<<endl;
		q[tail].x=qx;
		q[tail].y=qy;
		q[tail].step=0;
		book[qx][qy]=1;
		tail++;		//起点入队并标记 
		bfs(qx,qy);
		if(t[zx][zy]!='0') cout<<"-1"<<endl; //如果没找到,输出-1
		head=1;tail=1;//队列指针恢复 
	}
	return 0;
}

注释是自己加的,不知道为什么只输出-1

求大佬们帮着看看吧

2023/10/6 10:05
加载中...