POJ 1124 Oh, Those Achin' Feet

Springboot信息泄露以及heapdump的利用 努力是为了不平庸~安全有些时候是枯燥的,这一次,让我们先人一步,趣学渗透! 阅读详情

http://acm.pku.edu.cn/JudgeOnline/problem?id=1124

/*
    利用DFS回溯求所有最短路径(最短路径可能不止一条)
    行走的时候只有当下一个点是终点或者下一点是街道时才可以继续走到下一个点
    注意剪枝
    注意entrance/exit不参与load,只有街道参与load,即最终结果里凡是非街道结点都要输出0
    */
#include <iostream>
#include <map>
#include <string>
#include <memory>
#define MAX_N 20
#define QSIZE 500
using namespace std;

char graph[MAX_N + 1][MAX_N + 1]; //记录输入的图
double res[MAX_N + 1][MAX_N + 1]; //记录最终的结果,即每个街道的load值
int pre[MAX_N + 1][MAX_N + 1][2]; //记录每个结点前驱的坐标
int vTime[MAX_N + 1][MAX_N + 1];  //记录在找一对entrance和exit之间最短路径时,路径上每个点出现的次数,用于计算每个点需要分到的load值
int pos[MAX_N + 1][2];            //记录每个entrance/exit的坐标,index是:当前字符 - 'A'
bool v[MAX_N + 1][MAX_N + 1];     //DFS时标识这个点是否被访问过,访问时置1,回溯时置0


int dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; //遍历的四个方向

map<string, int> load;            //记录输入里每个entrance/exit对的load总和,对于AB 2 BA 1,要把BA转换成AB,所以最终是AB 3
map<string, int>::iterator itr;

int rowN, colN, srcR, srcC, destR, destC, pathNum, minLen; //计算时用到的相关变量

string temp;

//判断当前点是否可走
bool inRange(int curR, int curC)
{
    char type = graph[curR][curC];
    //是否在坐标轴内
    bool t1 = (curR >= 1 && curR <= rowN && curC >= 1 && curC <= colN);
    //是否是终点或者是街道,否则不可走
    bool t2 = ((curR == destR && curC == destC) || type == '.');
    return t1 && t2;
}
void dfs(int curR, int curC, int len)
{
    int d, nextR, nextC, tR, tC;
    if(curR == destR && curC == destC)
    {
        //超过了当前最短的,直接忽略掉
        if(len > minLen)
            return;
        //新的路径更短
        else if(len < minLen)
        {
            //重置数据
            memset(vTime, 0, sizeof(vTime));
            pathNum = 1;
        }
        //路径长度和最优的相等,则路径数增加1
        else
            pathNum++;
        minLen = len;
               
        //遍历路径,为每个节点的load比重加1
        nextR = pre[curR][curC][0];
        nextC = pre[curR][curC][1];
        while(!(nextR == srcR && nextC == srcC))
        {
            vTime[nextR][nextC]++;
            tR = pre[nextR][nextC][0];
            tC = pre[nextR][nextC][1];
            nextR = tR, nextC = tC;
        }
        return;
    }
    //剪枝
    if(len >= minLen)
        return;
   
    //遍历四个方向
    for(d = 0; d < 4; d++)
    {
        nextR = curR + dir[d][0], nextC = curC + dir[d][1];
        //判断是否可走
        if(v[nextR][nextC] || !inRange(nextR, nextC)) continue;
        v[nextR][nextC] = true;
        pre[nextR][nextC][0] = curR, pre[nextR][nextC][1] = curC;
        //继续走
        dfs(nextR, nextC, len + 1);
        //回溯
        v[nextR][nextC] = false;
       
    }
}

//利用DFS遍历所有的entrance/exit对找出所有的最短路径,并按照比例对相同的最短路径上的几点进行load均分
void travel()
{
    int lVal, i, j;
    for(itr = load.begin(); itr != load.end(); itr++)
    {
        //相关初始化
        temp = itr->first;
        lVal = itr->second;
        srcR = pos[temp[0] - 'A'][0], srcC = pos[temp[0] - 'A'][1];
        destR = pos[temp[1] - 'A'][0], destC = pos[temp[1] - 'A'][1];
        memset(v, 0, sizeof(v));
        memset(vTime, 0, sizeof(vTime));
        pre[srcR][srcC][0] = -1;
        v[srcR][srcC] = true;
        pathNum = 0;
        minLen = INT_MAX;

        //遍历
        dfs(srcR, srcC, 0);

        //按照各点的比重均分
        for(i = 1; i <= rowN; i++)
        {
            for(j = 1; j <= colN; j++)
                res[i][j] += ((double)vTime[i][j] / pathNum) * lVal;
        }
    }
}
int main()
{
    int i, j, l;
    char c;
    //输入格式化
    cin>>colN>>rowN;
    for(i = 1; i <= rowN; i++)
        for(j = 1; j <= colN; j++)
        {
            cin>>c;
            graph[i][j] = c;
            if(c >= 'A' && c <= 'O')
            {
                pos[c - 'A'][0] = i;
                pos[c - 'A'][1] = j;
            }
        }
    while(cin>>temp>>l && temp != "XX")
    {
        if(temp[0] > temp[1])
        {
            c = temp[0];
            temp[0] = temp[1];
            temp[1] = c;
        }
        itr = load.find(temp);
        if(itr == load.end())
            load[temp] = l;
        else
            load[temp] += l;
    }
    //遍历
    travel();
    //输出结果
    for(i = 1; i <= rowN; i++)
    {
        for(j = 1; j <= colN; j++)
        {
            //保留小数点后两位,进行四舍五入
            double temp = res[i][j];
            int t = temp * 1000 + 5;
            t = t / 10 * 10;
            temp = (double)t / 1000;
            printf("%7.2f", temp);
        }
        printf("/n");
    }
    return 0;
}

微信小程序marker 上的自定义气泡cover-view字体丢失以及max-width不生效问题 阅读详情

相关推荐

ROS2中间件选型指南:FastDDS与CycloneDDS零拷贝机制对比与实战

在机器人开发中,通信中间件是连接分布式节点的核心纽带,其性能直接影响系统的实时性与可靠性。DDS作为ROS2默认的通信标准,通过发布订阅模型和QoS策略,为高频大带宽场景提供了灵活的数据分发能力。并行计算与高性能传输的需求,推动了零拷贝技术的演进——从传统序列化到共享内存乃至指针传递,旨在减少数据复制开销、降低延迟。在激光雷达点云、相机图像等场景下,中间件的选型尤为关键。FastDDS凭借与ROS2的深度集成和丰富文档成为入门首选,而CycloneDDS在低延迟和资源占用上表现更优,借助iceoryx实现了

weixin_28726391的博客 259

zoj题目分类

饮水思源---zoj 转载自:http://bbs.sjtu.edu.cn/bbscon,board,ACMICPC,file,M.1084159773.A.html 注:所有不是太难的题都被归成了“简单题”,等到发现的时候已经太晚了,我太死脑筋 了……:( 有些题的程序我找不到了,555……:( SRbGa的题虽然都很经典……但是由于其中的大部分都是我...

446

ctf——writeup

ctf线上赛——第三关地址:http://106.75.86.18:2222提示:ip spoofing——ip伪造首先访问目标地址,一个正常的网页,挺文艺的。上面有些提示。根据上面的提示,我们浏览网页。找了好久,终于找到你。这个跳转链接。(在这个页面下方)我们接着点击这个链接,就跳转到administrator.php这个页面了。看到这个登录页面,就要知道用户名,密码,可是没有怎么办。一开始也试

Child_by_dream的博客 1320

poj1124 Oh, Those Achin' Feet dfs+bfs最短路

Oh, Those Achin' Feet Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 490   Accepted: 131 Description In recent days, a number of people have been injured afte

Dave_lzw的博客 651

【Dify精讲】第2章:后端服务架构深度剖析

Dify后端采用Flask应用工厂模式实现模块化开发,通过蓝图架构将API分为控制台、Web应用和服务接口三大模块。其设计亮点包括:1) 应用工厂模式支持多环境配置和独立测试;2) 蓝图分层管理实现API模块化,各模块职责清晰;3) 严格遵循RESTful原则设计API接口;4) 使用Flask-RESTful扩展简化API开发。这种架构既保持了Flask的灵活性,又实现了企业级应用的可维护性,是Flask项目架构的优秀实践案例。

wiyi9891的专栏 2126

POJ 1124 Oh, Those Achin' Feet 笔记

人行道的承载量。X*Y的城市。字符.代表道路,字符X代表建筑,A到O代表出入口,出入口属于建筑。给出出入口承载的人数,在选择最短路径的情况下,求人行道每点的负载。如果一对出入口有多条最短路径,每条道路负载是其平均值。

woniupengpeng的专栏 457

r3live 使用前提 雷达-相机外参标定 livox_camera_lidar_calibration

港科大livox_camera_calib虽然操作方便,但是使用mid360雷达会有视角问题(投影三维点到相机),尝试了很多场景,标定效果都不理想(推荐场景是楼梯间),看来港大的更适合avia之类窄角度的雷达。如果标定效果不好的话,就使用 getExt2节点,getExt1节点只优化外参,而getExt2节点在计算的时候会将一开始计算的内参作为初值和外参一起优化。一般使用getExt1节点即可,如果在外参初值验证过,并且异常值已经剔除后,优化还是有较大的残差,那么可以使用getExt2试一试。

z1872385的博客 2399

POJ 刷题顺序

POJ从简到难(按照AC数目排序)的列表如下,作为小弱的刷题

thestoryofsnow的专栏 31万+

RH850从0搭建Autosar开发环境系列讲解 - 总目录

Davinci Autosar实战开发从0构建开发能力。OS,COM,DCM,BSWMM,ECUM,VLINK,XCP,MEMMAP等模块配置,带你熟悉运行的autosar代码,包括MICROSAR的启动运行,使用GreenHills生成运行的hex。

weixin_42412049的博客 1万+

华为OD 面试手撕代码真题【岛屿的周长】

0代表水,1代表陆地,岛由陆地组成且岛内不允许有湖,让你求岛的周长。

MISAYAONE的博客 8420

GOOGLE的一道笔试题—求给定连通无环无向图可以生成的最小高度树

/*最近看到一道谷歌笔试题,“已知一颗无向无环连通图T的所有顶点和边的信息,现需要将其转换为一棵树,要求树的深度最小,请设计一个算法找到所有满足要求的树的根结点,并分析时空复杂度(描述算法即可,无需代码)”其实就是给定一个无向连通图,求以哪些顶点为根可以得到深度最小的树,思路比较简单,主要有两个步骤:(1)首先选取1号结点作为树根,进行一遍DFS,在DFS时计算每个节点

bobten2008的专栏 3707

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

POJ 1143 Number Game

/*http://acm.pku.edu.cn/JudgeOnline/problem?id=1143 博弈论(DFS + 状态记忆表 + 位运算), 假定一个走的人是A,第二个走的人是B A在当前状态下一定能够取胜的条件是:当前状态下存在一个数字,对于当A取走 这个数字后的状态,B不管怎么取都得输(即B不能够绝对取胜)  有了上面的分析就很容易看出这是一道博弈题,最终会形

bobten2008的专栏 2922

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

POJ 1639 Picnic Planning

 /*这题调得快吐血了,做得真辛苦这题主要就是求最小限度生成树,即给定一棵树,在某个节点上加上这个节点的最大度数,然后求一棵满足这样条件的树且最终的权值和最小。这道题就是在根节点Park上做度数限定,然后求最小限度生成树最小限度生成树的求法与MST(最小生成树密不可分)主要思路有以下几个步骤1)将根节点从图中去除掉2)对去除根节点的图求MST,注意这里去除根后的图可能是

bobten2008的专栏 1864

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

POJ Dreisam Equations

DFS + 表达式求值,输入处理很恶心 #include #include #define MAX_N 100using namespace std;int exp[MAX_N + 1];int curExp[MAX_N + 1];int expLen, expVal, curVal;int opType[3] = {-1, -2, -6};bool

bobten2008的专栏 1586

POJ 1632 Vase collection

 Vase collectionTime Limit: 1000MS Memory Limit: 10000KTotal Submissions: 1536 Accepted: 552DescriptionMr Cheng is a collector of old Chinese porcelain, more spec

bobten2008的专栏 1517

POJ 1186 方程的解数

 方程的解数Time Limit: 15000MS Memory Limit: 128000KTotal Submissions: 4000 Accepted: 1339Case Time Limit: 5000MSDescription已知一个n元高次方程: 其中:x1, x2,...,xn是未知数

bobten2008的专栏 1425

POJ 1103 Maze

/* dfs判断环,建图需要技巧,图变成了三维的(h * w * 2)第三维的2用来表示一个格子被/或者/分 成的两块 核心就是判断环,但是由于这题特殊性使得判断环比较简单;利用分别遍历h * w * 2个点,遍历到的点 设置为visited, 当遇到遍历初始点时且这个初始点不是前驱则表示找到一条环 注意一定要判断是否是前驱,否则会产生判断错误*/#

bobten2008的专栏 1398

POJ 1635 Subway tree systems

 /*主要是根据输入串建树,然后对树DFS,重新获得一个排序后的01串。对两个输入串分别运用上述方法分别得到两个排序后的01串,如果两个串相等则same,否则different关键在于DFS时对子树返回的01串进行存储和排序,然后重组比如对于0100101100100111和0011000111010101,重组后分别变成:0001101100101101和0001110011

bobten2008的专栏 1385

POJ 1078

http://acm.pku.edu.cn/JudgeOnline/problem?id=1078这题是典型的DFS回溯题,主要意思是给定两个整数,要求分别对这两个数进行因子分解,因子必须是100以内且不能重复。问,这两个整数是否存在不相交的因子集,例如:24和12,分别可以分解为2 * 12, 3 * 4,所以存在;而49和343就不行了,49不能分解(否则有7重复了),343只

bobten2008的专栏 1382

POJ 2044 Weather Forecast

/*深度优先搜索,需要记忆状态,状态的记忆包括四个角到目前为止没有下雨的时间+云当前所在的位置+当前的天数,一开始写错了一个地方害我调了N久,最近为啥没状态*/#include #define MAX_N 370#define MAX_S 80000using namespace std;struct day{    int state;}day

bobten2008的专栏 1272

POJ 1826 The Best Farm

The Best FarmTime Limit: 3000MS Memory Limit: 30000KTotal Submissions: 1519 Accepted: 455DescriptionBackground In a fight against invaders, farmer William get the

bobten2008的专栏 1217

POJ 1816 Wild Words

/*http://acm.pku.edu.cn/JudgeOnline/problem?id=1816trie树下的DFS, 感觉非常好的一道题,能说明很多问题*/#include #include #define MAX_M 100000using namespace std;//输入的pattern数以及待匹配的单词数int pNum, strNum

bobten2008的专栏 1206

POJ 1128 Frame Stacking

/*http://acm.pku.edu.cn/JudgeOnline/problem?id=1128DFS回溯实现拓扑排序*/#include #include #include #include #define MAX_N 32#define MAX_L 26using namespace std;char mapv[MAX_N + 1][M

bobten2008的专栏 1104

poj 1416 Shredding Company

/**  * DFS:由于在遍历时,preTemp会随时变化,因此当找到当前最优解时需要用preBest来保存preTemp  */#include #include #define MAX_LEN 6using namespace std;int preTemp[MAX_LEN + 1];int preBest[MAX_LEN + 1];int dis[MAX

bobten2008的专栏 953
上一篇: POJ 1123 For the Porsche
下一篇: POJ 1126 Simple Syntax
bobten2008
博客等级 码龄18年 153粉丝 157原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值