8连块
来源:互联网 发布:关键规则算法 编辑:程序博客网 时间:2024/05/16 19:25
题目:输入一个n*n的黑白图像(1表示黑色,0表示白色),任务是统计其中八连块的个数。如果两个黑格子有公共边或者公共顶点,就说它们属于同一个八连块。
输入:第一行输入一个整数n(n<=500),下面输入n行,每行是由n个0或1组成的字符串。
输出:输出有多少个八连块,以及每个块的面积。一个方格的面积为1。
分析:把图片最外层扩展开来,在最外面加一层白色的框框。。设置一个数组来存储每个八连块的面积。。DFS递归调用每一个黑色的方块。。DFS的最后一个参数要设置为传递引用。。
#include <iostream>#include <string>using namespace std;const int MAXN = 500;int maze[MAXN][MAXN], vis[MAXN][MAXN];int mianji[MAXN];void dfs(int x, int y, int &mianji) {if(vis[x][y] || !maze[x][y]) return;mianji++;vis[x][y] = 1;dfs(x-1, y-1, mianji); dfs(x-1, y, mianji); dfs(x-1, y+1, mianji);dfs(x, y-1, mianji); dfs(x, y+1, mianji);dfs(x+1, y-1, mianji); dfs(x+1, y, mianji); dfs(x+1, y+1, mianji);return;}int main() {int n;cin >> n;string str;memset(maze, 0, sizeof(maze));for(int i = 0; i < n; ++i) {cin >> str;for(int j = 0; j < n; ++j) {maze[i+1][j+1] = str[j] - '0';}}memset(vis, 0, sizeof(vis));memset(mianji, 0, sizeof(mianji));int ans = 0;for(int i = 1; i <= n; ++i) {for(int j = 1; j <= n; ++j) {if(!vis[i][j] && maze[i][j]) {dfs(i, j, mianji[ans]);ans++;}}}cout << ans << endl;for(int i = 0; i < ans; ++i) {cout << mianji[i] << endl;;}return 0;}
0 0
- 8连块
- 主机hdmi接口连上第二块显示器后,耳机没有声音
- 甲骨文终于干掉了Java之父Sun:连块骨头都没剩下
- linux块设备8
- 8 Java同步块
- 8-代码块
- 块
- 块
- 块
- 【Codeforces Round 328 (Div 2)B】【找规律】The Monster and the Squirrel 正多边形连边分割块数
- MySql 8小时重连问题
- mysql的8小时重连问题
- MySql 8小时重连问题
- 实用代码块记录8
- 因太漂亮连换8份工作
- 肺结核染头发口头语连英8p
- 防盗连
- 回连
- appstore应用被拒绝显示Prepare for Submission
- SpringMVC的第一个入门案例
- Learn C# scripting in Unity
- notepad++比较不错的技巧
- HDU 4419 Colourful Rectangle (线段树扫描线)
- 8连块
- AFNetworking2的SSL身份认证 -1022错误解决办法
- 设计模式-单例模式
- .net-C#
- 资料存储
- java .net php
- 关于linux系统密码策略的设置
- css初学选择器
- 动态脚本语言