多条路径2

#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <stack>

using namespace std;

const int SIZE = 6;

//边界数组,四个方向,按照下、右、上、左的顺序
int coordinate[8][2] = {{-1,0}, {-1,1}, {0,1}, {1,1},{1,0},{1,-1},{0,-1},{-1,-1}};

stack<int> sx;
stack<int> sy;
stack<int> sxCopy;
stack<int> syCopy;

int mazeBfs[SIZE][SIZE]={
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0
};

//广搜用的迷宫
int mazeDfs[SIZE][SIZE]={
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0
}; //深搜用的迷宫

int m = 6;
int n = 6;
int p = 0;
int q = 0;
int r = 5;
int s = 5;
int ShortestPathLength; //最短路径的长度
int ShortestPahtNumber; //最短路径的条数

//广搜求最短路径长度
int BFS();

//深搜求最短路径条数
void DFS(int x, int y, int len);

int main()
{
//求最短路径长度
ShortestPathLength = BFS();
if (ShortestPathLength == -1) //没路可走时
{
printf("No Solution!\n");
}

//求最短路径条数及输出所有的最短路径
ShortestPahtNumber = 0;
sx.push(p);
sy.push(q);
DFS(p, q, 0);

//输出结果
printf("最短路径长度: %d\n\n", ShortestPathLength);
printf("最短路径条数: %d\n\n", ShortestPahtNumber);
}

int BFS()
{
queue<int> qx; //存横坐标的队列
queue<int> qy; //存纵坐标的队列
queue<int> qlen; //存长度的队列
int xa, ya; //当前节点坐标
int length; //到达当前节点长度

qx.push(p);
qy.push(q);
qlen.push(0);
mazeBfs[p][q] = 1;
while (!qx.empty())
{
if ((qx.front()==r) && (qy.front()==s)) //判断是否到达小鼠b
{
return qlen.front();
}

//临时保存队头值
int xx, yy ,ll;
xx = qx.front();
yy = qy.front();
ll = qlen.front();

//保存完之后,出队
qx.pop();
qy.pop();
qlen.pop();

for (int i=0; i<8; i++)
{
//算第i方向上的新值
xa = xx + coordinate[i][0];
ya = yy + coordinate[i][1];
length = ll;

//新的点在迷宫内,且没有走过
if ((xa>=1) && (xa<=n) && (ya>=1) && (ya<=m) && (mazeBfs[xa][ya]==0))
{
//入队
qx.push(xa);
qy.push(ya);
length += 1;
qlen.push(length);

//标记新点
mazeBfs[xa][ya] = 1;
}
}
}

return -1; //如果没有路,返回0
}

void DFS(int x, int y, int len)
{
if ((x==r) && (y==s) && (len==ShortestPathLength)) //找到一条最短路径
{
ShortestPahtNumber++;
return ;
}

for (int i=0; i<8; i++)
{
int xx, yy;
xx = x + coordinate[i][0];
yy = y + coordinate[i][1];

if ((xx>=1) && (xx<=n) && (yy>=1) && (yy<=m) && (mazeDfs[xx][yy]==0))
{
sx.push(xx);
sy.push(yy);
mazeDfs[xx][yy] = 1;
DFS(xx, yy, len+1);

//回溯
sx.pop();
sy.pop();
mazeDfs[xx][yy] = 0;
}
}
}

时间: 2024-10-10 09:00:31

多条路径2的相关文章

hdu4862 2014多校B题/ 费用流(最优情况下用不大于K条路径覆盖)(不同的解法)

题意: 一个数字矩阵,可以出发K次,每次可以从右边或者下面走,要求(在收益最大情况下)覆盖全图,不能则输出-1.(规则:每次跳一步的时候若格子数字相等则获得该数字的能量,每跳一步消耗距离的能量).每个格子走且仅能走一次. 选<=K条路径,最优情况来覆盖全图. 显然用拆点为二分图. 一种解法:边(流量,费用) 源点向X部连边(1,0)Y部向汇点连边(1,0)X到Y,若能到,则有边(1,消耗-获得).关键点(解决每个点都覆盖,恰好起到填补的作用):在X部最上面添加一个点,源点连之(k,0)它向所有Y

二叉树的和为某一条路径

题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. //非递归版本 //思路: 1.按先序遍历把当前节点cur的左孩子依次入栈同时保存当前节点,每次更新当前路径的和sum: 2.判断当前节点是否是叶子节点以及sum是否等于expectNumber,如果是,把当前路径放入结果中. 3.遇到叶子节点cur更新为NULL,此时看栈顶元素,如果栈顶元素的把栈顶元素保存在last变量中,同时弹出栈顶元素,当

带权随机数问题--根据权重随机选择一条路径

最近工作中遇到了一个根据权重随机选择一条路径的问题,一时没有啥好方案,参考借鉴了网上的经验,得出了如下解决方案: 思路:1.求权重的和,对(0,权重之歌和]区间进行划分,每个权重占用长度为权重的区间: 2.产生一个在(0,权重之和]区间的等概率随机数: 3.该随机数落在哪个区间,则该区间对应的权重的映射为本次产生的带权随机数. 1 import java.util.ArrayList; 2 import java.util.HashMap; 3 import java.util.List; 4

poj 2253 一条路径中的最大边 再找出最小的

题目大意,有两只青蛙,分别在两个石头上,青蛙A想要到青蛙B那儿去,他可以直接跳到B的石头上,也可以跳到其他石头上,再从其他石头跳到B那儿,求青蛙从A到B的所有路径中最小的Frog Distance,我们定义Frog Distance为从A到B的一条路径中最大的一条边假如点0到点1有3条路第一条路径 会经过2个点 3条边 边的值为 1 4 3第二条路径 一条边 5第三条路径 1 3 2 那么 Frog Distance 分别为 4 5 3 则最终输出3 Sample Input 20 03 4 3

POJ 2253 Frogger (求每条路径中最大值的最小值,Dijkstra变形)

Frogger Time Limit: 1000MS Memory Limit: 65536K Description Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fiona Frog who is sitting on another stone. He plans to visit her, but since the water is dirty and full of tou

hdu6035 Colorful Tree 树形dp 给定一棵树,每个节点有一个颜色值。定义每条路径的值为经过的节点的不同颜色数。求所有路径的值和。

/** 题目:hdu6035 Colorful Tree 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6035 题意:给定一棵树,每个节点有一个颜色值.定义每条路径的值为经过的节点的不同颜色数.求所有路径的值和. 思路:看题解后,才想出来的.树形dp. 求所有路径的值和 = 路径条数*总颜色数(n*(n-1)*colors/2)-sigma(每种颜色没有经过的路径条数) 主要是求每种颜色没有经过的路径条数. 画一棵树,我直接用颜色值表示节点编号. 2

多条路径最多点权覆

见题: 题目简单粗暴,真的很难想. 直接从优解的角度考虑:每条路径都是从一个叶节点到另一个叶节点的,显然这样可以经过最多的点. 考虑那对于所有的叶节点来说,这l条路径,最多覆盖l*2个点(因为每条路径最多覆盖两条叶节点),这是针对于叶节点来说的,那对于其他节点呢? 我们顺着这个思路,从叶节点向上推一层,在叶节点之上的一层,最多也覆盖l*2个点,同理,往上的每一层,对答案的贡献也都是l*2,同时加上该层的点数限制. 一层一层往上推,那不就是拓扑吗?我们可以从叶节点开始跑拓扑,记录其所在层数,最后输

[LC] 112题 路径总和(在二叉树里判断是否有哪条路径之和等于某个值)

①题目 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和. 说明: 叶子节点是指没有子节点的节点. 示例: 给定如下二叉树,以及目标和 sum = 22, 返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2. ②思路 用总和sum去减去每次遍历时的根值 ③代码 1 class Solution { 2 public boolean hasPathSum(TreeNode root, int s

binary-tree-maximum-path-sum——二叉树任意一条路径上的最大值

Given a binary tree, find the maximum path sum. The path may start and end at any node in the tree. For example:Given the below binary tree, 1 / 2 3 Return 6. 找出任意两个节点之间的路径,并且该路径的值之和最大. PS:关键在于递归函数的返回值,应该返回该节点的任意子节点到该节点父节点之间路径的最大值,即root->l返回的值应该为root