牛客网 2018年全国多校算法寒假训练营练习比赛(第四场) 题解

A-石油采集

题目描述
随着海上运输石油泄漏的问题,一个新的有利可图的行业正在诞生,那就是撇油行业。如今,在墨西哥湾漂浮的大量石油,吸引了许多商人的目光。这些商人们有一种特殊的飞机,可以一瓢略过整个海面20米乘10米这么大的长方形。(上下相邻或者左右相邻的格子,不能斜着来)当然,这要求一瓢撇过去的全部是油,如果一瓢里面有油有水的话,那就毫无意义了,资源完全无法利用。现在,商人想要知道,在这片区域中,他可以最多得到多少瓢油。
地图是一个N×N的网络,每个格子表示10m×10m的正方形区域,每个区域都被标示上了是油还是水
链接:https://www.nowcoder.net/acm/contest/76/A
题解
遍历所有点,判断当前点能不能和周围某个点相消。例如

样例一
###
#..
###
样例二
###
#..
#..
#..

判断某点能否相消,就要看与其周围直线连接的点是否是#。
可以证明的是,永远是从最开头消点,例如样例二。最好的方案是(0,0)(1,0)、(0,1)(0,2)、(2,0)(3,0)。当我们判断(0,0)能否与其周围点相消时,先要dfs走到这个方向的开头,反过来消。

代码

#include <bits/stdc++.h>
using namespace std;
int n,ans;
char mp[55][55];
const int dir[4][2]={
  {-1,0},{
  1,0},{
  0,-1},{
  0,1}};
bool dfs(int x,int y)
{
    for(int i=0;i<4;i++){
        int dx=x+dir[i][0];
        int dy=y+dir[i][1];
        if(dx<n&&dx>=0&&dy<n&&dy>=0&&mp[dx][dy]=='#'){
            mp[x][y]='.';
            if(!dfs(dx,dy)){
                mp[dx][dy]='.';
                ans++;
                return true;
            }
            mp[x][y]='#';
        }
    }
    return false;
}
int main()
{
    int T;
    while(~scanf("%d",&T)){
    for(int cas=1;cas<=T;cas++){
        ans=0;
        scanf("%d",&n);
        for(int i=0;i<n;i++) scanf("%s",mp[i]);
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
针对2018年高教社杯全国大学生数学建模竞赛D题,我们可以采取以下步骤进行解题: 1. 确定问题:该题的问题是要求我们设计一种算法,能够在给定的络拓扑结构下,计算出任意两个节点之间的最短路径长度。 2. 分析问题:该题的难点在于如何处理络中存在的环路和负权边,这些都会影响到最短路径的计算。因此,我们需要选择一种合适的算法来解决这些问题。常用的算法包括Dijkstra算法、Bellman-Ford算法、Floyd算法等。 3. 确定算法:鉴于本题的络规模较小,我们可以考虑使用Floyd算法来解决。Floyd算法适用于任意两点之间的最短路径计算,可以同时处理有向图和无向图、带权图和不带权图等多种情况,同时也能够处理负权边和环路。 4. 实现算法:实现Floyd算法的关键是构造一个邻接矩阵,表示络中各个节点之间的距离。具体实现过程可以参考以下步骤: a. 初始化邻接矩阵:将所有节点之间的距离初始化为正无穷大,将每个节点到自己的距离初始化为0。 b. 利用邻接矩阵进行计算:对于每一对节点i和j,遍历所有节点k,比较节点i到k再到节点j的距离和节点i到节点j的距离,取最小值更新邻接矩阵中的距离值。 c. 输出结果:遍历邻接矩阵,输出任意两个节点之间的最短路径长度。 5. 检验算法:为了验证算法的正确性,可以选择一些节点进行测试,比较计算结果与实际情况是否一致。 综上所述,通过采用Floyd算法,我们可以有效地解决2018年高教社杯全国大学生数学建模竞赛D题中的最短路径问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值