OpenJudge NOI 1.8 17:最好的草
生活随笔
收集整理的這篇文章主要介紹了
OpenJudge NOI 1.8 17:最好的草
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目鏈接】
OpenJudge NOI 1.8 17:最好的草
【題目考點】
1. 二維數組
2. 方向數組
表示上下左右的方向數組:
int dir[4][2] = {{0,1},{0,-1},{-1,0},{1,0}};
或
int dx[4] = {0,0,1,-1}, dy[4] = {1,-1,0,0};
【解題思路】
理解題意,相鄰兩個’#'算作一塊草叢。
可以理解為:
.#. 是1個草叢
.## 是1個草叢
### 是2個草叢
.#.
### 是4個草叢
.#.
因而每個#有兩種情況:
- 參與到一個兩個#組成的草叢中,相當于每個#貢獻0.5個草叢。如果它周圍有x個#,它就會參與構成x個草叢,它貢獻的草叢數為0.5x0.5x0.5x
- 單獨形成一個草叢,每個#貢獻1個草叢
為了避免處理小數,把上述推導中的小數變為整數,改為計分制,一個草叢算2分,敘述如下:
遍歷整個二維數組,如果當前位置是#,則遍歷其周圍上下左右四個位置
- 如果這四個位置中存在#,則中心位置參與構成兩個#的草叢。每存在一個#,加1分。
- 如果四個位置不存在#,那么中心位置的#獨自構成一個草叢,加2分。
最后將總分數除以2,即為草叢的個數。
【題解代碼】
解法1:二維方向數組
#include <bits/stdc++.h> using namespace std; #define N 105 int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; int main() {//單獨的草算2分,如果由2塊組成的草一定會被計算兩次,每個算1分。最后除以2。char a[N][N];int r, c, s = 0;cin >> r >> c;for(int i = 1; i <= r; i++)for(int j = 1; j <= c; j++)cin >> a[i][j];for(int i = 1; i <= r; i++)for(int j = 1; j <= c; j++){if(a[i][j] == '#'){bool flag = false;//i,j周圍有是否有草for(int d = 0; d < 4; d++){int x = i + dir[d][0], y = j + dir[d][1];if(x >= 1 && x <= r && y >= 1 && y <= c && a[x][y] == '#'){s++;flag = true;}}if(flag == false)//一個#單獨構成草叢s += 2;}}cout << s/2;return 0; }解法2:一維方向數組
#include <bits/stdc++.h> using namespace std; #define N 105 int dx[4] = {0,0,1,-1}, dy[4] = {1,-1,0,0}; int main() {char a[N][N];int r, c, s = 0;cin >> r >> c;for(int i = 1; i <= r; i++)for(int j = 1; j <= c; j++)cin >> a[i][j];for(int i = 1; i <= r; i++)for(int j = 1; j <= c; j++){if(a[i][j] == '#'){bool flag = false;//i,j周圍有沒有草for(int d = 0; d < 4; d++){int x = i + dx[d], y = j + dy[d];if(x >= 1 && x <= r && y >= 1 && y <= c && a[x][y] == '#'){s++;flag = true;}}if(flag == false)s += 2;}}cout << s/2;return 0; }總結
以上是生活随笔為你收集整理的OpenJudge NOI 1.8 17:最好的草的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 代码发adb,Andro
- 下一篇: c车模电磁循迹代码_电磁炉检修快速入门