説明
ゴー、彼は気まぐれ囲碁ゲームを設計したかったが、基本的な質問がある日のような少し:線分で囲まれた面積を計算する方法は、それを閉じていますか?
次の例では、領域の「0」で囲まれた「1」によって基板5 * 5「01」の組成物である:3。
0 0 0 0 0
0 1 1 1 1
0 1 0 1 0
1 0 0 1 1
1 1 1 1 0
規定:5の第3行ではないように算出した統計領域「1」「0」、特に、0エッジで計算されていない、交差点の水平および垂直ライン数に閉曲線で囲まれましたカウントエリア。
入力
ボード10 * 10行列、0,1からなる基板の各点。
出力
1 0囲まれたタイトル領域から出力することが意図されます。
サンプル入力
0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 1
0 0 0 1 1 1 0 0 0 0
0 0 0 1 0 0 1 1 1 0
0 0 0 0 1 1 0 0 0 1
0 0 0 0 0 1 0 0 1 0
0 0 0 1 1 0 0 1 0 0
0 0 0 1 0 0 0 1 0 0
0 0 0 0 1 1 1 0 0 0
0 0 0 0 1 1 1 0 0 0
サンプル出力
12
1 #include<iostream>
2 //#include<fstream>
3 using namespace std;
4 int a[100][100];
5 int dir[4][2]={1,0,0,-1,-1,0,0,1};
6 void dfs(int x,int y){
7 a[x][y]=1;
8 int dx,dy;
9 for(int i=0;i<4;i++){
10 dx=x+dir[i][0];
11 dy=y+dir[i][1];
12 if(dx>=1&&dx<=10&&dy>=1&&dy<=10&&!a[dx][dy])
13 dfs(dx,dy);
14 }
15 }
16 int main(){
17 int ans=0;
18 //fstream file("haha.txt");
19 for(int i=1;i<=10;i++){
20 for(int j=1;j<=10;j++){
21 //file>>a[i][j];
22 cin>>a[i][j];
23 }
24 }
25 for(int i=1;i<=10;i++){
26 if(!a[1][i]) dfs(1,i);
27 if(!a[10][i]) dfs(10,i);
28 if(!a[i][1]) dfs(i,1);
29 if(!a[i][10]) dfs(i,10);
30 }
31 for(int i=1;i<=10;i++){
32 for(int j=1;j<=10;j++){
33 if(!a[i][j])
34 ans++;
35 }
36 }
37 cout<<ans<<endl;
38 return 0;
39 }
首先说方法,我们要把圈外的0都变成1,然后遍历整个数组数一数一共有几个0那么围成的面积就是几
然后说一下怎么实现,主体思想是用dfs或者bfs,因为我们只想把圈外的0变成1,所以我们从边缘开始搜索
for(int i=1;i<=10;i++){
if(!a[1][i]) dfs(1,i);
if(!a[10][i]) dfs(10,i);
if(!a[i][1]) dfs(i,1);
if(!a[i][10]) dfs(i,10);
}
这个代码实现的就是这一块,注意必须要从边缘开始,不能遍历整个数组搜索,如果遍历整个数组搜索的话,数组里所有的0都会变成1了。
然后就是dfs的思想,上下左右连一块的算连着,斜着的不算,从边缘开始,所有连着的0变成1。