1. 程式人生 > >ACM-數細胞

ACM-數細胞

ring log 函數 chan count ons mes ++ urn

題目描述:數細胞 一矩形陣列由數字0到9組成,數字1到9代表細胞,細胞的定義為沿細胞數字上下左右還是細胞數字則為同一細胞,求給定矩形陣列的細胞個數。編程需要用到的隊列及其相關函數已經實現,你只需要完成count函數以及主函數即可。 #include #include using namespace std; const int maxsize =50000; struct pos { int x; int y; }; typedef struct se { pos data[maxsize]; int front,rear; }Sequeue; void init(Sequeue *&Q) { Q=(Sequeue *)malloc(sizeof(Sequeue)); Q->front=-1; Q->rear=-1; } void change(int a[50][50],int m,int n) { int i,j; for(i=0;i<m;i++) for(j="0;j<n;j++)" if(a[i][j]!="0)" a[i][j]="1;" }="" int="" empty(sequeue="" *q)="" {="" if(q-="">rear==Q->front) return 1; else return 0; } void insertsequeue(Sequeue *&Q,int i,int j) { if((Q->rear+1)%maxsize==Q->front) { cout<<"隊列已滿!"<<endl; exit(0);="" }="" q-="">rear=(Q->rear+1)%maxsize; Q->data[Q->rear].x=i; Q->data[Q->rear].y=j; } void delsequeue(Sequeue *&Q,int &i,int &j) { if(Q->rear==Q->front) { cout<<"隊列已空!"<<endl; exit(0);="" }="" q-="">front=(Q->front+1)%maxsize; i=Q->data[Q->front].x; j=Q->data[Q->front].y; } int count(int a[50][50],int m,int n) { } int main() { return 1; }

輸入

第一行輸入兩個整數,分別代表矩陣的行和列 輸入m*n的矩陣,由數字0到9組成。

輸出

細胞個數。

樣例輸入

4 10
1 2 3 4 5 1 1 1 6 7 
1 0 3 4 5 6 1 5 1 0
2 0 4 5 6 6 1 6 7 1
0 0 6 0 6 6 1 0 8 9

樣例輸出

1
思路:題目要使用BFS,我直接用DFS也可以A,數細胞就是數矩陣相連個數,直接每次DFS後計數即可。
// 數細胞.cpp : 定義控制臺應用程序的入口點。
//

#include "stdafx.h"

/*由1連接成多少個整塊*/
#include 
<iostream> #include <cstring> const int MAX = 1005; using namespace std; int n, m, ans, map[MAX][MAX], vis[MAX][MAX];//地圖 int dis[4][2] = { 1, 0, -1, 0, 0, 1, 0, -1};//標記數組,方向數組 void DFS(int x, int y)//橫縱坐標,在遞歸中將走過的點標記為1 { for (int i = 0; i < 4; i++) { int tx = x + dis[i][0
];//根據方向數組改變方向 int ty = y + dis[i][1]; if (tx >= 0 && tx<n && ty >= 0 && ty<m && map[tx][ty] && !vis[tx][ty])//在地圖中且是1,並且沒走過,走過的地方不能回頭 { vis[tx][ty] = 1;//標記為走過 DFS(tx, ty); } } } int main() { while (cin >> n >> m)//行列 { //init memset(map, 0, sizeof(map)); memset(vis, 0, sizeof(vis)); ans = 0; //read for (int i = 0; i<n; i++) for (int j = 0; j < m; j++) { int t; cin >> t; if (t >= 1 && t <= 9) map[i][j] = 1; else map[i][j] = 0; } //找起點,即找到開始遞歸的坐標 for (int i = 0; i<n; i++) { for (int j = 0; j<m; j++) { if (map[i][j] && !vis[i][j]) { vis[i][j] = 1; DFS(i, j);//當遞歸全部結束後,說明已經不能再找到W與這部分相連 ans ++; } } } cout << ans; } return 0; }

ACM-數細胞