广搜+最短路径输出

1432: 【基础】走出迷宫的最少步数

题目描述

一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走;有的格子是空地,可以走。
给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到)。只能在水平方向或垂直方向走,不能斜着走。

输入

第一行是两个整数,R和C,代表迷宫的行数和列数。( 1<= R,C <= 40)
接下来是R行,每行C个字符,代表整个迷宫。空地格子用'.'表示,有障碍物的格子用'#'表示。迷宫左上角和右下角都是'.'。

输出

输出从左上角走到右下角至少要经过多少步(即至少要经过多少个空地格子)。计算步数要包括起点和终点。

样例输入复制

5 5
..###
#....
#.#.#
#.#.#
#.#..

样例输出复制

9

 

#include<bits/stdc++.h>
using namespace std;

int n,m;
int vis[50][50];
char a[50][50];
struct node{
	int x,y;
	int floor;
	struct node * pre=NULL;
};
queue<struct node *> q;
int dx[]={1,0,-1,0};
int dy[]={0,-1,0,1};

int ffloor[50][50];
int main(int argc, char** argv) {
	freopen("abc.txt","r",stdin);
	cin>>n>>m;
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			cin>>a[i][j];
			if(a[i][j]=='.'){
				vis[i][j]=0;
			}else{
				vis[i][j]=1;
				ffloor[i][j]=0;
			}
		}
	}
	vis[0][0]=1;
	struct node *head=new struct node;
	head->x=0;
	head->y=0;
	head->floor=1;
	ffloor[0][0]=1;
	q.push(head);
	struct node *tail;
	while(!q.empty()){
		struct node *h=q.front();
		q.pop();
		for(int i=0;i<4;i++){
			int x=h->x+dx[i];
			int y=h->y+dy[i];
			if(x>=0&&x<n&&y>=0&&y<m&&vis[x][y]==0){
				struct node *t=new node;
				t->x=x;
				t->y=y;
				t->pre=h;
				t->floor=h->floor+1;
				ffloor[x][y]=t->floor;
				q.push(t);
					if(t->x==4&&t->y==4){
						tail=t;
						cout<<"dd"<<endl;
				}
				vis[x][y]=1;
			}
		}
	}
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			cout<<setw(3)<<ffloor[i][j];
		}
		cout<<endl;
	}
	stack<struct node *> s;
	while(tail!=NULL){
		s.push(tail);
		//cout<<tail->x<<","<<tail->y<<endl;
		tail=tail->pre;
	}
//	cout<<(tail->pre->pre)->x<<","<<(tail->pre->pre)->y<<endl;
	while(!s.empty()){
		cout<<s.top()->x<<", "<<s.top()->y<<endl;
		s.pop();
	}

	
	return 0;
}




 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在ArcGIS Engine开发环境中,使用C#语言进行最短路径分析,可以按照以下步骤进行: 1. 创建一个新的ArcGIS Engine工程。 2. 添加需要进行最短路径分析的地图数据和网络数据集。 3. 在Visual Studio中创建一个新的Windows Form应用程序。 4. 在Form窗口中添加地图控件,用于显示地图数据。 5. 在代码中创建一个NetworkAnalyst对象,并设置其参数,包括起点、终点、分析方式等。 6. 调用NetworkAnalyst对象的Solve方法进行最短路径分析。 7. 获取分析结果,包括最短路径、路径长度、路径节点等,并在地图上绘制最短路径。 8. 编译和运行程序,测试最短路径分析的功能。 下面是一个示例代码,用于进行最短路径分析: ```csharp using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.NetworkAnalyst; using ESRI.ArcGIS.SystemUI; namespace shortestPath { public partial class Form1 : Form { private IMap m_map = null; private IEngineNetworkAnalystEnvironment m_naEnv = null; private INetworkDataset m_networkDataset = null; private IEngineNetworkAnalyst m_naSolver = null; private INALayer m_naLayer = null; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { //获取MapControl控件的IMap对象 m_map = axMapControl1.Map; //创建EngineNetworkAnalystEnvironment对象 m_naEnv = new EngineNetworkAnalystEnvironmentClass(); //加载NetworkDataset string ndsPath = @"C:\data\network\MyNetworkDataset.nds"; m_networkDataset = m_naEnv.CreateNetworkDataset(ndsPath); //创建EngineNetworkAnalyst对象 m_naSolver = new EngineNetworkAnalystClass(); m_naSolver.NetworkDataset = m_networkDataset; //设置分析参数 INALayer naLayer = m_naSolver.Context.Layer; INetworkSource networkSource = m_networkDataset.NetworkSources.get_Item(0); INetworkDataset networkDataset = networkSource as INetworkDataset; IPoint fromPoint = new PointClass(); fromPoint.X = 100; fromPoint.Y = 200; IPoint toPoint = new PointClass(); toPoint.X = 300; toPoint.Y = 400; INetworkElement fromElement; INetworkElement toElement; networkDataset.BuildNetwork(out fromElement, out toElement); INetworkElementBarriers fromBarriers = new NetworkElementBarriersClass(); INetworkElementBarriers toBarriers = new NetworkElementBarriersClass(); INetworkAttribute2 lengthAttribute = networkDataset.get_AttributeByName("Length") as INetworkAttribute2; m_naSolver.Context.OutSpatialReference = m_map.SpatialReference; m_naSolver.Context.DirectionsLengthUnit = esriNetworkAttributeUnits.esriNAUMiles; m_naSolver.Context.UseHierarchy = false; m_naSolver.Context.FindBestOrder = true; m_naSolver.Context.PreserveFirstStop = true; m_naSolver.Context.PreserveLastStop = true; m_naSolver.Context.UseTimeWindows = false; m_naSolver.Context.UseStartTime = false; m_naSolver.Context.UseHierarchy = true; m_naSolver.Context.HierarchyWeight = 0.7; m_naSolver.Context.TravelDirection = esriNetworkTravelDirection.esriNTDAgainstFlow; m_naSolver.Context.ImpedanceAttributeName = lengthAttribute.Name; m_naSolver.Context.FromPoint = fromPoint; m_naSolver.Context.ToPoint = toPoint; m_naSolver.Context.FromElement = fromElement; m_naSolver.Context.ToElement = toElement; m_naSolver.Context.FromPointBarrierElements = fromBarriers; m_naSolver.Context.ToPointBarrierElements = toBarriers; //解决最短路径问题 m_naSolver.Solve(m_naSolver.Context, ref naLayer, null); //获取分析结果 m_naLayer = naLayer as INALayer; IRouteResult routeResult = m_naLayer.Context.Result as IRouteResult; IGeometry geometry = routeResult.Route.ShapeCopy; double length = geometry.Length; //在地图上绘制最短路径 IFeatureLayer featureLayer = m_naLayer as IFeatureLayer; IFeatureClass featureClass = featureLayer.FeatureClass; IFeature feature = featureClass.GetFeature(0); IFeatureSelection featureSelection = featureLayer as IFeatureSelection; featureSelection.Clear(); featureSelection.Add(feature); //刷新地图 axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewAll, null, null); } } } ``` 希望这个示例代码能够对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值