阿里秋招筆試題——求冰田區域
阿新 • • 發佈:2018-11-19
問題描述
將一個區域,分成 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,並且該 * 點連起來的冰塊區域 * 點全部變為 0
- 遍歷完所有的點即可,輸出冰塊數
程式碼實現
#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;
}
程式碼如有錯誤,歡迎大家指點出來!