杭电计算机研究生复试2015年第二题
2016-03-20 15:59
323 查看
/*给一个数字矩阵,如果上下左右中数值相同,则表示一个连通区域,求矩阵中联通区域的数量输入:行列数,矩阵 输出:连通域的数量
<span style="white-space:pre"> </span>思路:用BFS遍历*/#include<stdio.h>#include<queue>using namespace std;const int maxn = 100;int n,m;int matrix[maxn][maxn];bool inq[maxn][maxn] = {false};int X[4] = {0,0,1,-1};int Y[4] = {1,-1,0,0};struct node{int x,y;}Node;bool judge(int x,int y,int numb){if(x >=n || x < 0|| y>=m || y< 0) return false; //越界else if(inq[x][y] == true) return false;else if(matrix[x][y] == numb) return true;return false;}void BFS(int x,int y,int numb){ //num为当前要比对的数字queue<node> Q;int newX,newY;Node.x = x,Node.y = y;Q.push(Node);inq[x][y] = true;while(!Q.empty()){node top = Q.front(); // 取队首Q.pop();for(int i = 0; i< 4;i++){ //循环取上下左右的连通点 入队列newX = top.x + X[i];newY = top.y + Y[i];if(judge(newX,newY,numb)){Node.x = newX,Node.y = newY;Q.push(Node);inq[newX][newY] = true;}}}}int main(){int ans = 0; //记录连通区域个数scanf("%d%d",&n,&m);for(int x = 0; x < n;x++){for(int y = 0;y < m; y++){scanf("%d",&matrix[x][y]);}}for(int x = 0;x < n;x++){for(int y = 0;y < m;y++){if(inq[x][y] == false){ans++;BFS(x,y,matrix[x][y]);}}}printf("%d\n",ans);}
相关文章推荐
- 浅谈HTTP中Get与Post的区别【转】
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) D. Delivery Bears 二分+网络流
- TCP:状态控制码
- 怎么理解RSA算法
- Http request传输图片和附属信息(old)
- TCP协议中的三次握手和四次挥手(图解)
- 访问一个网页过程中发生了什么
- 数据结构--双栈队列练习题
- 基于HttpClient的HttpUtils(后台访问URL)
- Http协议学习笔记
- 手写服务器httpserver_封装Response_封装Request_JAVA199-201
- 树的三种表示方式
- Web后端语言模拟http请求(带用户名和密码)实例代码大全
- 网络流——SAP模板
- 数据结构学习笔记
- Spark性能优化第二季-Task、数据倾斜及网络性能优化
- 《CLR Via C#》 如何查看计算机是否安装了.NET Framework及其版本
- 网络开发库从libuv说到epoll
- 简单的基于Socket的TCP编程实例
- 深度学习Deep learning