1. 程式人生 > >阿里秋招筆試題——求冰田區域

阿里秋招筆試題——求冰田區域

問題描述

將一個區域,分成 m×n 個塊,若某一個塊有冰則用 * 表示,無冰則用 0 表示,任給一個這樣的區域,求冰田區域(冰田區域劃分規則:如果兩個小塊之間能夠在不穿越其他塊的情況下連成直線,則**屬於同一冰田區塊)個數?

  • 輸入


    這裡寫圖片描述

  • 輸出

    冰塊數

樣例輸入輸出

輸入
4 4
* 0 0 0
0 0 0 0
0 0 * 0
0 0 0 *
4 6
0 0 0 0 0 0
0 0 * 0 0 *
0 0 * * 0 0
0 0 0 * 0 *
輸出

2
3

問題分析

  1. 首先遍歷到 * 的點,冰塊數+1,並且該 * 點連起來的冰塊區域 * 點全部變為 0
  2. 遍歷完所有的點即可,輸出冰塊數

程式碼實現

#include<iostream>
using namespace std;
const int MaxSize=1000;
class MGraph{//構建圖 
    public:
    MGraph(int n,int m);
    char adj[MaxSize][MaxSize];
};
MGraph::MGraph(int
n,int m){//初始化 for(int i=0;i<=n;i++)//第一列全部置為0 adj[i][0]='0'; for(int i=0;i<=m;i++)//第一行全部置為0 adj[0][i]='0'; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>adj[i][j];//輸入節點 } void DFS(MGraph &G,int i,int j){//深度遍歷,把*的所有連在一起的點全部變為0 int ti=i+1,tj=j+1; int ki=i-1
,kj=j-1; for(int b=ki;b<=ti;b++)//把該點的八個方向和自身都遍歷 for(int c=kj;c<=tj;c++){//遇到是*的全部變為0 if(G.adj[b][c]=='*') { G.adj[b][c]='0'; DFS(G,b,c); } } } int main(){ int n,m,num; while(1){ num=0; cin>>n>>m; MGraph G(n,m);//建立圖 for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ if(G.adj[i][j]=='*'){ num++;//第一次遇到*,num++ DFS(G,i,j);//把該*點的全部鄰接點變為0 }//繼續的遍歷 } cout<<num<<endl; } return 0; }

程式碼如有錯誤,歡迎大家指點出來!