C++程式:查詢下一起搶劫發生的地點


假設我們有一個大小為n x m的字元二維矩陣。其中存在兩種字元 '*' 和 '.'。只有三個 '*',代表發生了3起搶劫,所有其他位置都標記為 '.'。偵探得到情報,第四起搶劫將發生在一個這樣的單元格中:所有四個被搶劫的單元格構成一個矩形的頂點,且平行於地圖的邊。我們需要找到這個單元格。

問題類別

在資料結構中,陣列是特定型別元素的有限集合。陣列用於將相同型別的元素儲存在連續的記憶體位置中。陣列被賦予一個特定的名稱,並在各種程式語言中透過該名稱進行引用。要訪問陣列的元素,需要索引。我們使用術語“name[i]”來訪問陣列“name”中位置“i”處的特定元素。各種資料結構,如堆疊、佇列、堆、優先佇列,都可以使用陣列實現。陣列上的操作包括插入、刪除、更新、遍歷、搜尋和排序操作。訪問以下連結瞭解更多資訊。此問題需要矩陣來儲存輸入,然後可以使用基於矩陣的操作來解決此問題。

https://tutorialspoint.tw/data_structures_algorithms/array_data_structure.htm

https://tutorialspoint.tw/cprogramming/c_multi_dimensional_arrays.htm

因此,如果我們的問題的輸入如下所示:

*.*
*..
...

那麼輸出將是 (2, 3)

步驟

為了解決這個問題,我們將遵循以下步驟:

n := row count of matrix
m := column count of matrix
x := 0
y := 0
for initialize i := 0, when i < n, update (increase i by 1), do:
   for initialize j := 0, when j < m, update (increase j by 1), do:
      if matrix[i, j] is same as '*', then:
         x := x XOR i
         y := y XOR j
print (x + 1, y + 1)

示例

讓我們看看下面的實現,以便更好地理解:

#include <bits/stdc++.h>
using namespace std;
void solve(vector<vector<char>> matrix){
   int n = matrix.size();
   int m = matrix[0].size();
   int x, y;
   x = y = 0;
   for (int i = 0; i < n; i++){
      for (int j = 0; j < m; j++)
         if (matrix[i][j] == '*'){
            x ^= i;
            y ^= j;
         }
   }
   cout << x + 1 << ", " << y + 1 << endl;
}
int main(){
   vector<vector<char>> matrix = { { '*', '.', '*' }, { '*', '.', '.' }, { '.', '.', '.' } };
   solve(matrix);
}

輸入

{ { '*', '.', '*' }, { '*', '.', '.' }, { '.', '.', '.' } }

輸出

2, 3

更新於:2022年4月7日

瀏覽量:105

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.