為了判斷數獨解是否合法,我們需要遵循以下步驟:
1. **檢查每一行**:確保1到9每個數字在每一行中只出現一次。
2. **檢查每一列**:確保1到9每個數字在每一列中只出現一次。
3. **檢查每個3x3的宮**:確保1到9每個數字在每個3x3的宮中只出現一次。
對于每個case,我們將執行上述三個檢查。如果所有檢查都通過,則輸出"YES",表示解是合法的;如果任何檢查失敗,則輸出"NO",表示解不合法。
下面是實現這一邏輯的C++代碼:
#include <iostream>
#include <vector>
using namespace std;bool checkRow(const vector<vector<int>>& sudoku, int row) {vector<bool> seen(10, false);for (int num : sudoku[row]) {if (seen[num]) return false;seen[num] = true;}return true;
}bool checkColumn(const vector<vector<int>>& sudoku, int col) {vector<bool> seen(10, false);for (int i = 0; i < 9; ++i) {int num = sudoku[i][col];if (seen[num]) return false;seen[num] = true;}return true;
}bool checkSquare(const vector<vector<int>>& sudoku, int startRow, int startCol) {vector<bool> seen(10, false);for (int row = 0; row < 3; ++row) {for (int col = 0; col < 3; ++col) {int num = sudoku[startRow + row][startCol + col];if (seen[num]) return false;seen[num] = true;}}return true;
}bool isValidSudoku(const vector<vector<int>>& sudoku) {for (int i = 0; i < 9; ++i) {if (!checkRow(sudoku, i) || !checkColumn(sudoku, i)) return false;}for (int row = 0; row < 9; row += 3) {for (int col = 0; col < 9; col += 3) {if (!checkSquare(sudoku, row, col)) return false;}}return true;
}int main() {int T;cin >> T;while (T--) {vector<vector<int>> sudoku(9, vector<int>(9));for (int i = 0; i < 9; ++i) {for (int j = 0; j < 9; ++j) {cin >> sudoku[i][j];}}cout << (isValidSudoku(sudoku) ? "YES" : "NO") << endl;}return 0;
}
這段代碼首先定義了幾個輔助函數來檢查數獨的行、列和3x3宮是否滿足條件。然后,`isValidSudoku`函數使用這些輔助函數來判斷整個數獨是否合法。最后,`main`函數讀取輸入并對每個case調用`isValidSudoku`函數,根據返回值輸出相應的結果。