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