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

本文提供了牛客网2018年算法寒假训练营练习比赛第四场的部分题解,包括石油采集问题的遍历解法、道路建设的最小生成树解决策略、求交集的二分搜索方法、通知小弟问题的最短传播路径分析、Call to your teacher问题的深度优先搜索解法以及全排列问题的解决方案。
摘要由CSDN通过智能技术生成

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]);
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值