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]);
for(

本文提供了牛客网2018年算法寒假训练营练习比赛第四场的部分题解,包括石油采集问题的遍历解法、道路建设的最小生成树解决策略、求交集的二分搜索方法、通知小弟问题的最短传播路径分析、Call to your teacher问题的深度优先搜索解法以及全排列问题的解决方案。
 题解&spm=1001.2101.3001.5002&articleId=79312262&d=1&t=3&u=b4c3724ced58428c873564d1b17219b1)
337

被折叠的 条评论
为什么被折叠?



