纪中暑假培训 : Date 2 卫星照片 (Standard IO)

xiaoxiao2021-02-28  34

卫星照片 (Standard IO)

题目:

农夫 John 正在研究他的农场的卫星照片.照片为一个R (1 <=R <= 75) 行 C (1 <= C <= 75) 列的字符矩阵表示.如下图:   ………………   ..#####…….##..   ..#####……##…   ………………   #…….###…..#.   #…..#####…….

  图上的一块相连通的 “#” 表示一群奶牛或一个房间, 两个子”#” 连通的意思是说左右或上下相连.而下面的两块则是分开的:   ….   .#..   ..#.   ….

  John现在根据卫星照片上的的这些”#”块的形状来判断哪些是牛群,哪些是房间.如果一个”#”块形状一个内部和边全部都是“#”的矩形,则是房间,如果一个连通块只有一个“#”,也是房间.其它的则认为都是牛群.在第一个图中,有三个房间 ( 2x1, 2x5, and 1x1)和2群牛.   请根据输入文件中的数据,统计出房间数和牛群数.数据中牛群不会包围另一个牛群或房间.

思路:记忆化深搜

#include<iostream> #include<cstdio> using namespace std; bool a[100][100]; int ans1,ans2; bool check(int xx,int yy) { if (a[xx+1][yy]||a[xx-1][yy]||a[xx][yy+1]||a[xx][yy-1]) return true; return false; } void dfs(int q,int p) { a[q][p]=false; if (a[q+1][p]) dfs(q+1,p); if (a[q-1][p]) dfs(q-1,p); if (a[q][p+1]) dfs(q,p+1); if (a[q][p-1]) dfs(q,p-1); } void cc(int x,int y) { int l=x,r=y; while (a[l][y]) l++; while (a[x][r]) r++; l--; r--; for (int i=x;i<=l;i++) for (int j=y;j<=r;j++) if (a[i][j]==false) { dfs(x,y); ans2++; return; } for (int i=x;i<=l;i++) for (int j=y;j<=r;j++) a[i][j]=false; for (int i=x;i<=l;i++) for (int j=y;j<=r;j++) if (check(i,j)) { for (int i=x;i<=l;i++) for (int j=y;j<=r;j++) a[i][j]=true; dfs(x,y); ans2++; return; } ans1++; return; } int main() { int n,m; char c; scanf("%d%d\n",&n,&m); for (int i=1;i<=n;i++,getchar()) for (int j=1;j<=m;j++) { c=getchar(); if (c=='#') a[i][j]=true; if (c=='.') a[i][j]=false; } for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) if (a[i][j]) cc(i,j); printf("%d\n",ans1); printf("%d\n",ans2); }
转载请注明原文地址: https://www.6miu.com/read-2602660.html

最新回复(0)