社区讨论

自己出的题代码出问题了 求助 玄关

学术版参与者 2已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@lu4zbrrz
此快照首次捕获于
2024/03/24 11:48
2 年前
此快照最后确认于
2024/03/24 14:08
2 年前
查看原帖
代码内容:输入一个迷宫的长、宽以及迷宫内容(空格代表可以走,#代表墙,s和e分别是起点和终点),返回迷宫是否有解。出现问题:输出不符合答案。
CPP
#include<bits/stdc++.h>
using namespace std;
const int maxn=101;//迷宫最高大小; 
int mg[maxn][maxn];//迷宫;
int sizhou[4][2]={{1,0},{0,1},{-1,0},{0,-1}};//四周位置;
bool visit[maxn][maxn];//是否走过 ;
int sx,sy,ex,ey,n,m;//起始点x、y,终点x、y,长(x),宽(y);
deque<int>x;//队列x坐标;
deque<int>y;//队列y坐标; 
string a[maxn];//输入字符串数组  
string f;
//
int k(int sx,int sy,int ex,int ey){//查询函数; 
	x.push_back(sx);//从起始点出发; 
	y.push_back(sy);//同上; 
	while(!x.empty()){
		int bx=x.front();//设游标; 
		int by=y.front();//同上; 
		visit[bx][by]=1;//标记; 
		for(int i=0;i<4;i++){//遍历游标四周; 
			int pbx=bx+sizhou[i][0];//目前位置; 
			int pby=by+sizhou[i][1];//同上; 
			if(pbx<n && pbx>=0 && pby < m && pby >= 0 && mg[pbx][pby]!=0 && visit[pbx][pby]==0){//是否不出格且可以走且没走过; 
				if(pbx==ex && pby == ey)return 1;//是否到终点; 
				x.push_back(pbx);//添加位置; 
	            y.push_back(pby);//同上; 
	            visit[pbx][pby]=1;//标记; 
			}	
		}
		x.pop_front();//踢掉游标; 
		y.pop_front();//同上; 
	}
	return 0;
}
//
int main(){
	memset(visit,0,sizeof(visit));//初始化; 
	/*cin >> n >> m;
	cin >> sx >> sy >> ex >> ey;
	for(int i=0;i<n;i++){//输入迷宫; 
		for(int j=0;j<m;j++){
			cin >> mg[i][j];
		}
	}*/
	//上面这个对 ,下面的新版不对 
	scanf("%d%d",&n,&m);
	getline(cin,f);
	for(int i=0;i<m;i++){
		getline(cin,a[i]);
	}
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			if(a[i][j]!='#'){
				mg[i][j]=1;
				if(a[i][j]=='s'){
					sx=i;sy=j;
				}
				if(a[i][j]=='e'){
					ex=i;ey=j;
				}
			}else if(a[i][j]==' '){
				mg[i][j]=0;
			}
		}
	}
	cout << k(sx,sy,ex,ey);
	return 0;
}
/*
       大概框架
int k(int sx,int sy,int ex,int ey){
	队伍初始化;
	for(队伍不为空){
		设置作用点;
		设为走过 ;
		for(遍历身边){
			if(条件){
				if(在终点){
					return 1; 
				} 
				移到队尾;
				设为走过; 
			}	 
		} 
		删队头;
	}
	return 0;
}
int main(){
	获取数据;
	cout << k(sx,sy,ex,ey); 
	return 0;
} 

回复

4 条回复,欢迎继续交流。

正在加载回复...