dfs解法:
首先我们来对题目中的这句话进行分析:“这些商人们有一种特殊的飞机,可以一瓢略过整个海面20米乘10米这么大的长方形。(上下相邻或者左右相邻的格子,不能斜着来)”,不难理解就是只能采集“日”字型区域的石油(“日”字可以正着放也可以转90度放置),之后可以发现满足条件的油田满足一个条件,即其坐标(x,y)之和x+y满足一奇一偶,所以我们分别统计为奇数的个数ans1和偶数的个数ans1,由于奇偶要配对所以取min(ans1,ans2)。
#include <stdio.h> #define N 1000 int n,m,book[N][N],ans1=0,ans2=0; char f[N][N]; int next[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; int min(int n,int m){ return n>m?m:n; } void dfs(int x,int y){ if((x+y)%2){ ans1++; }else{ ans2++; } int tx,ty; for(int k=0;k<4;k++){ tx=x+next[k][0]; ty=y+next[k][1]; if(tx<0||ty<0||tx>=m||ty>=m){ continue; } if(f[tx][ty]=='#'&&book[tx][ty]==0){ book[tx][ty]=1; dfs(tx,ty); } } return ; } int main() { scanf("%d",&n); int cnt1=0; while(n--){ int sum=0; scanf("%d",&m); for(int i=0;i<m;i++){ scanf("%s",f[i]); } for(int i=0;i<m;i++){ for(int j=0;j<m;j++){ book[i][j]=0; } } for(int i=0;i<m;i++){ for(int j=0;j<m;j++){ if(f[i][j]=='#'&&book[i][j]==0){ ans1=0;ans2=0; book[i][j]=1; dfs(i,j); sum=sum+min(ans1,ans2); } } } printf("Case %d: %d\n",++cnt1,sum); } return 0; }