Luogu P1331 海战

来源:互联网 发布:泰国地图导航软件 编辑:程序博客网 时间:2024/04/30 06:39

题目传送门:点击打开题目


主要思路:题目说了只有当两个'#'组成的方形连在一起时就输出"Bad placement.",
因为如果他们是连个独立的方形,就代表他们连在一起的四个格子中,肯定有一部分是只有3个'#',
所以只要出现这种情况就输出"Bad placement.".
剩下的呢,就是求图中的独立子图,直接用DFS来实现FLOODFILL,就是在遇见一个'#'时,
如果他没有被算进某个子图时,就以他为起点开始遍历,将所有能遍历的点都算进这个子图里,
因为前面已经判断过船不是方形的情况,直接输出答案总数就可以了.


附上代码:

#include <iostream>#include <cstdlib>#define MAXN 2010#define MAXM 2010using namespace std;string map[MAXN];bool book[MAXN][MAXM];int nextway[4][2]={{0,1},{0,-1},{1,0},{-1,0}};int n,m,ans,sum;void init(){int i,j;cin>>n>>m;for(i=1;i<=n;i++){cin>>map[i];}for(i=1;i<=n;i++){for(j=0;j<=m-1;j++){sum=0;if(map[i][j]=='#')sum++;if(map[i+1][j]=='#')sum++;if(map[i+1][j+1]=='#')sum++;if(map[i][j+1]=='#')sum++;if(sum==3){cout<<"Bad placement.";exit(0);}}}return;}void dfs(int x,int y){int tx,ty,k;for(k=0;k<=4-1;k++){tx=x+nextway[k][0];ty=y+nextway[k][1];if(tx<1 || tx>n || ty<0 || ty>m-1)continue;if(map[tx][ty]=='#' && book[tx][ty]==false){book[tx][ty]=true;dfs(tx,ty);}}return;}void out(){cout<<"There are "<<ans<<" ships.";return;}int main(){int i,j;init();for(i=1;i<=n;i++){for(j=0;j<=m-1;j++){if(map[i][j]=='#'&& book[i][j]==false){book[i][j]=true;ans++;dfs(i,j);}}}out();return 0;}

原创粉丝点击