2612两人路径和最短

原创 2018年04月16日 17:04:30
        #include<cstdio>
        #include<iostream>
	#include<cstdlib>
	#include<cstring>
	#include<queue>
	using namespace std;
	struct node
	{
		int x, y, step;
	};//记录点的坐标以及到该点的时间
	int n, m;
	char map[209][209];
	int dx[4] = { 0,-1,0,1 };
	int dy[4] = { -1,0,1,0 };
	int vis[209][209], num[209][209];//vis标记数组,num记录到@的总时间
	bool judge(int x, int y)
	{
		if (x >= 0 && x < n&&y >= 0 && y < m )
			return true;
		return false;
	}
	void bfs(int x, int y)
	{
		queue<node> p;
		while (!p.empty())
			p.pop();
		node st;
		st.x = x;
		st.y = y;
		st.step = 0;
		p.push(st);
		vis[x][y] = 1;
		while (!p.empty())
		{
			node t = p.front();
			node next;
			p.pop();
			for (int i = 0; i < 4; i++)
			{
				next.x = t.x + dx[i];
				next.y = t.y + dy[i];
				next.step = t.step+1;
				if (judge(next.x, next.y)&&map[next.x][next.y]!='#' && !vis[next.x][next.y])
				{
					p.push(next);
					vis[next.x][next.y] = 1;
					if (map[next.x][next.y] == '@')//找到了一个出口就记录求和,别的路径不需要
						num[next.x][next.y] += next.step;
				}
			}

		}
	}
	int main()
	{
		int yx, yy, mx, my, i, j;
		while (~scanf("%d%d", &n, &m))
		{
			for (i = 0; i < n; ++i)
			{
				getchar();
				for (j = 0; j < m; ++j)
				{
					scanf("%c", &map[i][j]);
					if (map[i][j] == 'Y')
					{
						yx = i;
						yy = j;
					}
					else if (map[i][j] == 'M')
					{
						mx = i;
						my = j;
					}
				}
			}
			memset(vis, 0, sizeof(vis));//这题是两个人找,其实就是一个人,虽然BFS得到的是最短路,但是其实过程中如果有多个“出口”
			memset(num, 0, sizeof(num));//没一个的路径其实都被记录下来了,如果单人的话这种情况就需要剪枝,但多人的话就需要记录求和
			bfs(yx, yy);
			memset(vis, 0, sizeof(vis));
			bfs(mx, my);
			int ans = 9999999;
			for (i = 0; i < n; ++i)//找最小总时间
			{
				for (j = 0; j < m; ++j)
				{
					if (num[i][j] != 0 && ans > num[i][j])
						ans = num[i][j];
				}
			}
			printf("%d\n", ans * 11);
		}
		return 0;
	}


Crossing River POJ1700

Crossing River Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7873   ...
  • tiantangrenjian
  • tiantangrenjian
  • 2011-11-19 11:08:49
  • 1388

旅游模拟查询系统 vs2008编写 C++

  • 2010年04月29日 18:21
  • 6.13MB
  • 下载

SDUT 2868 贪心(最短时间过河问题)

我 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 n个人要过一座桥,只是在漆黑的夜里,没有火把显然是不行的...
  • became_a_wolf
  • became_a_wolf
  • 2016-03-28 19:29:11
  • 258

算法导论-单源最短路径/每对顶点最短路径

  • 2011年10月06日 23:08
  • 130KB
  • 下载

poj-1700

题目链接 题意简述: 有N个人要过河,只有一艘船最多承载两个人,第i个人过河有时间T_i,两个人一组过河的时间由较长那个人的时间确定,不要忘记算船回来的时间,求过河的最短时间。 题意分析:如果...
  • shuimu12345678
  • shuimu12345678
  • 2013-05-30 22:06:37
  • 539

矩阵的最短路径和

题目: 给定一个矩阵m,从左上角开始每次只能向右或者向下走,最后到达右下角的为止,路径上所有的数字累加起来就是路径和,返回所有路径中的最小的路径和。 举例: 1 3 5 9 8 1 3 4 ...
  • StubbornAccepted
  • StubbornAccepted
  • 2017-05-17 14:40:26
  • 493

最短路径和

给定一个只含非负整数的m*n网格,找到一条从左上角到右下角的可以使数字和最小的路径。  注意事项 你在同一时间只能向下或者向右移动一步 您在真实的面试...
  • a963621552
  • a963621552
  • 2018-01-30 16:48:35
  • 6

数据结构 c++ 图的最短路径问题 (邻接表)

  • 2017年11月20日 18:47
  • 3KB
  • 下载

蚁群算法单路径和多路径路由

  • 2011年12月06日 18:53
  • 5KB
  • 下载

最短路径基本介绍(2)--Dijkstra算法(单源最短路径算法)

算法7:Dijkstra最短路算法        上一篇博客我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”。本周来来介绍指定一个...
  • Acmer_Sly
  • Acmer_Sly
  • 2016-11-24 00:05:46
  • 329
收藏助手
不良信息举报
您举报文章:2612两人路径和最短
举报原因:
原因补充:

(最多只允许输入30个字)