題:c++
e.g.spa
0 1 2 0 1code
3 2 0 0 2blog
0 2 3 1 0rem
2 3 0 0 2input
3 2 2 1 0it
1 是獵人 2 是兔子 3 是石頭 0 是空白io
1獵人 從8個方向打2兔子編譯
算這個矩陣總共能打到多少隻兔子class
還能連續打的,遇到 2 2 這樣的
思路:
1) 統計原始地圖上的兔子總數和全部獵人所在位置;
2) 遍歷每一個獵人,每一個獵人依此殺掉他當前能夠殺掉的全部兔子;
3) 最後大概剩下的兔子8個方向上都沒有獵人或者被石頭擋住之類的,統計剩下的兔子總數;
4) 返回差值。
//沒編譯過不知道哪裏會不會出錯的代碼
void killRabbits(pair<int,int> hunter, vector<vector<int>>& input) { int delta_in_directions[8][2]={{-1,-1}, {-1,0}, {-1,1}, {0,-1}, {0,1}, {1,-1}, {1,0}, {1,1}}; for (int i=0; i<8; i++) { int current_r=hunter.first+delta_in_directions[i], current_c=hunter.second+delta_in_directions[i]; while (current_r>=0&¤t_r<N&¤t_c>=0&¤t_c<N) { if (input[current_r][current_c]==2) input[r][c]=0; else if (input[current_r][current_c]!=0) break; current_r+=delta_in_directions[direction]; current_c+=delta_in_directions[direction]; } } } int RabbitsKilled(vector<vector<int>> input) { int N=input.size(), rabbits_count=0; vector<pair<int,int>> hunters; for (int r=0;r<N;r++) { for (int c=0;c<N;c++) { if (input[r][c]==1) hunters.push_back(pair<int,int>(r,c)); else if (input[r][c]==2) ++rabbits_count; } } for (pair<int,int> hunter : hunters) killRabbits(input, hunter); int rabbits_remained_count=0; for (int r=0; r<N;r++) { for (int c=0;c<N;c++) { if (input[r][c]==2) ++rabbits_remained_count; } } return rabbits_count-rabbits_remained_count; }