一个二维矩阵存储的世界地图里,每个小方格区域被染上不同的颜色,求此图中的国家总数(上下左右不可斜对角)。
来源:互联网 发布:php编写软件安卓版 编辑:程序博客网 时间:2024/04/25 22:56
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
int resolution(vector< vector<int> > &A)
{
//self-defined construct
struct Point
{
int line;
int col;
Point(int X, int Y) :
line(X), col(Y)
{
}
~Point()
{
}
};
//allocate bitArray for Nodes' visited 0-1 state
int N = A.size();
int M = A.at(0).size();
char *isChecked = new char[(N * M + 8) / 8];
if (isChecked == NULL)
{
return -1;
}
//initialize all node with all unvisited state.
for (int i = 0; i < (N * M + 8) / 8; ++i)
{
isChecked[i] = 0;
}
int currColor = -1;
stack<Point> currS;// diagram's depth-first traversal algorithm
int totalCn = 0;
for (int ii = 0; ii < N; ++ii)
{
for (int jj = 0; jj < M; ++jj)
{
if ((isChecked[(ii * M + jj) / 8] & (1 << ((ii * M + jj) % 8))) == 0)
{ // if current Node not yet been visited, set visited.
isChecked[(ii * M + jj) / 8] |= (1 << ((ii * M + jj) % 8));
currS.push(Point(ii, jj));// a new 4-branch tree's rootNode
++totalCn;
currColor = A[ii][jj];
//Start merging all Neighboring Same color Node whose value equals currColor
while (!currS.empty())
{
Point tmp = currS.top();
currS.pop();
int i = tmp.line;
int j = tmp.col;
//current node's right neighbor if exists
if ((j + 1 < M)
&& ((isChecked[(i * M + j + 1) / 8]
& (1 << ((i * M + j + 1) % 8))) == 0)
&& (A[i][j+1] == currColor))
{
isChecked[(i * M + j + 1) / 8] |= (1 << ((i * M + j + 1) % 8));
currS.push(Point(i, j + 1));
}
//current node's down neighbor if exists
if ((i + 1 < N)
&& ((isChecked[((i+1) * M + j) / 8]
& (1 << (((i+1) * M + j) % 8))) == 0)
&& (A[i+1][j] == currColor))
{
isChecked[((i+1) * M + j ) / 8] |= (1 << (((i+1) * M + j ) % 8));
currS.push(Point(i+1, j ));
}
//current node's left neighbor if exists
if ((j - 1 >=0)
&& ((isChecked[(i * M + j - 1) / 8]
& (1 << ((i * M + j - 1) % 8))) == 0)
&& (A[i][j-1] == currColor))
{
isChecked[(i * M + j - 1) / 8] |= (1 << ((i * M + j - 1) % 8));
currS.push(Point(i, j - 1));
}
//current node's upper neighbor if exists
if ((i - 1 >=0 )
&& ((isChecked[((i-1) * M + j ) / 8]
& (1 << (((i-1) * M + j ) % 8))) == 0)
&& (A[i-1][j] == currColor))
{
isChecked[((i-1) * M + j) / 8] |= (1 << (((i-1) * M + j ) % 8));
currS.push(Point(i-1, j));
}
}
}
}
}
delete[] isChecked;
isChecked = NULL;
return totalCn;
}
int main(int argc, char** argv)
{
return 0;
}
- 一个二维矩阵存储的世界地图里,每个小方格区域被染上不同的颜色,求此图中的国家总数(上下左右不可斜对角)。
- 二维矩阵存储的世界地图里,每个小方格里着色不同,求所有的国家总数
- 二维矩阵存储的着色地图方格里,求出总的国家数。
- uva 10615 二分图匹配 每个点上的不同边必须染上不同颜色 求最小染色数
- php求每个月正班工作日总数的小算法
- 三对角矩阵压缩存储--注意对角元素的下标
- 关于matlab中的diag函数(矩阵对角元素的提取和创建对角阵)
- 寻找二维矩阵里的一个数
- [Java学习笔记]小练习_求矩阵对角线的和&清零对角线上的值
- 二维数组的相关操作,求主/斜对角,求外围数字和等
- poj 3051 dfs(二维矩阵求*连通的最大区域)
- 1029: 求矩阵的两对角线上的元素之和
- 求矩阵的两对角线上的元素之和 oj15
- 1029:求矩阵的两对角线上的元素之和
- Echarts世界地图的国家名称中文化
- 对角矩阵的性质(diagonal matrix)
- 产生一个50X2的矩阵(二维数组),每个元素是0-10的随机数
- 每日一道算法题:求一个矩阵中最大的二维矩阵(元素和最大)
- java 学习曲线(Java学习书籍推荐)
- descendantFocusability属性用法简析
- 还是畅通工程
- C语言双向循环链表实现
- Deep Learning(深度学习)学习笔记整理系列之(四)
- 一个二维矩阵存储的世界地图里,每个小方格区域被染上不同的颜色,求此图中的国家总数(上下左右不可斜对角)。
- JavaScript学习日志——流程控制
- z-index
- 【bzoj4590】[Shoi2015]自动刷题机 二分
- Boost.Smart_ptr/enable_share_from_this笔记
- 第八周项目三指向学生的指针
- Android基础——Service
- Deep Learning(深度学习)学习笔记整理系列之(五)
- 43.约瑟夫环