牛客题霸 -- HJ43 迷宫问题

解题步骤;

参考代码:

cpp 复制代码
//最短路径下标
vector<vector<int>> MinPath;
//临时路径
vector<vector<int>> tmp;
int row = 0;
int col = 0;
void FindMinPath(vector<vector<int>>& nums, int i, int j)
{
	nums[i][j]=1;
	tmp.push_back({i,j});

	//说明这条路径已经走通
	if(i==row-1&&j==col-1)
	{
		//第一次,即MinPath.size()==0时也要给MinPath赋值
		//否则最终的MinPath就会等于0了
		if(MinPath.size()==0||tmp.size()<MinPath.size())
		{
			MinPath=tmp;
		}
		return;
	}

	//无论是向哪个方向走,都必须要确保这个方向的位置能走,
	//保证不越界并且这个方向的值不为1,否则就不能走
	//向上
	if(i-1>=0&&nums[i-1][j]==0)
	{
		FindMinPath(nums,i-1,j);
	}
	//向下
	if(i+1<row&&nums[i+1][j]==0)
	{
		FindMinPath(nums,i+1,j);
	}
	//向左
	if(j-1>=0&&nums[i][j-1]==0)
	{
		FindMinPath(nums,i,j-1);
	}
	//向右
	if(j+1<col&&nums[i][j+1]==0)
	{
		FindMinPath(nums,i,j+1);
	}

	//经过该点的四个方向都已经走过了,此时应该回溯,即
	//把这个点从tmp中删除掉,并把该点的值恢复为原来的0,
	//因为原来一定是0,如果原来是1是不会进来这一层递归的
	tmp.pop_back();
	nums[i][j]=0;

}


int main()
{
	cin>>row>>col;
	vector<vector<int>> nums(row,vector<int>(col));
	for(int i=0;i<row;i++)
	{
		for(int j=0;j<col;j++)
		{
			cin>>nums[i][j];
		}
	}
	FindMinPath(nums,0,0);
	for(int i=0;i<MinPath.size();i++)
	{
		cout<<"("<<MinPath[i][0]<<","<<MinPath[i][1]<<")"<<endl;
	}
	return 0;
}

你学会了吗???

相关推荐
星夜离尘566 小时前
MATLAB 工程实验:不等间隔流量积分,先把缺口与覆盖率说清楚
开发语言·matlab·时间戳·数据质量·数值积分
Ai-_Man6 小时前
Meta Muse还是不可以导出左侧所有对话,只能点进去单条内容导出,方法不对吗?
开发语言·人工智能·ai·小程序·c#·1024程序员节
梓豪csd6 小时前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
BK贝壳6 小时前
bool-hybrid-array 落盘我只认 .bha:用 Create_BHA / Ask_BHA 做布尔数组序列化
数据结构·python·numpy·1024程序员节
会编程的小孩7 小时前
C++ qt的安装
c++
学逆向的7 小时前
C 枚举变量
c语言·开发语言·网络安全
Sakura_j_h_7 小时前
Python 在定时任务里输出 emoji,UnicodeEncodeError 从哪来
开发语言·字符编码·windows·python·定时任务
冷凝雨7 小时前
前导零、后导零、最高有效位、最低有效位计算(C)
c语言
鸥梨菌Honevid8 小时前
C 语言 restrict 关键字深度解析:从“独占访问”承诺到编译器激进优化
c语言
企业数字化笔记9 小时前
视频人体姿态怎么做三维可视化?2D关键点、深度局限与技术选型
人工智能·算法·音视频