สมมติว่าเราได้ให้เมทริกซ์ขนาด 9×9 ที่เรียกว่าซูโดกุ ภารกิจคือตรวจสอบว่ารูปแบบซูโดกุที่ให้มานั้นถูกต้องหรือไม่
โดยทั่วไปแล้ว กระดานซูโดกุจะมีลักษณะดังนี้
กฎของซูโดกุ −
-
ทุกแถวมีตัวเลขอยู่ในช่วง 1-9
-
ทุกคอลัมน์มีตัวเลขอยู่ในช่วง 1-9
-
แต่ละบล็อกขนาด 3×3 มีตัวเลขที่ไม่ซ้ำกันอยู่ในนั้น
-
แถวใดแถวหนึ่งไม่สามารถมีตัวเลขเดียวกันได้
-
คอลัมน์ใดคอลัมน์หนึ่งไม่สามารถมีหมายเลขเดียวกันได้
ตัวอย่างเช่น
อินพุต-1 −
sudoku[]= [["3","5",".",".","2",".",".",".","."] ,["7",".",".","1","6","5",".",".","."] ,[".","9","8",".",".",".",".","6","."] ,["8",".",".",".","6",".",".",".","3"] ,["4",".",".","5",".","4",".",".","1"] ,["7",".",".",".","2",".",".",".","6"] ,[".","6",".",".",".",".","2","8","."] ,[".",".",".","4","1","9",".",".","5"] ,[".",".",".",".","8",".",".","7","9"]]
ผลผลิต − จริง
คำอธิบาย − เนื่องจากตัวเลขทั้งหมดภายในเมทริกซ์ Sudoku เป็นไปตามรูปแบบของ Sudoku ที่ถูกต้อง ผลลัพธ์จึงเป็น True
แนวทางการแก้ปัญหานี้
เริ่มแรกเราจะตรวจสอบว่ากระดาน Sudoku ที่ระบุมีคอลัมน์ที่มีตัวเลขไม่ซ้ำกันหรือไม่ จากนั้นเราจะตรวจสอบแถว แต่ละบล็อก 3*3 มีตัวเลขทั้งหมดที่ไม่ซ้ำกันในนั้น เราจะตรวจสอบแต่ละแถวบล็อกและคอลัมน์บล็อกว่ามีจำนวนที่ซ้ำกันหรือไม่ เราจะคืนค่าเท็จ มิฉะนั้นจะคืนค่าเป็นจริง
-
รับอินพุตของอาร์เรย์ 2 มิติสำหรับกระดานซูโดกุ
-
ฟังก์ชันบูลีนเพื่อตรวจสอบแถวว่าองค์ประกอบที่มีอยู่ในนั้นไม่ซ้ำกันหรือไม่
-
ฟังก์ชันบูลีนเพื่อตรวจสอบคอลัมน์ว่าองค์ประกอบที่มีอยู่ในคอลัมน์นั้นไม่ซ้ำกันหรือไม่
-
ฟังก์ชันบูลีนเพื่อตรวจสอบบล็อกว่าองค์ประกอบที่มีอยู่ในนั้นไม่ซ้ำกันหรือไม่
ตัวอย่าง
#include<bits/stdc++.h> using namespace std; bool validSudoku(vector<vector<char>>& sudoku) { int row = 0, col = 0, i = 0, block = 0; int count[9]; for (row = 0; row < 9; ++row){ memset(count, 0, 9 * sizeof(int)); for (col = 0; col < 9; ++col){ if (sudoku[row][col] != '.') ++count[sudoku[row][col]-'1']; } for (i = 0; i < 9; ++i) if (count[i] > 1) return false; } for (col = 0; col < 9; ++col){ memset(count, 0, 9 * sizeof(int)); for (row = 0; row < 9; ++row){ if (sudoku[row][col] != '.') ++count[sudoku[row][col]-'1']; } for (i = 0; i < 9; ++i) if (count[i] > 1) return false; } int block_row = 0, block_col = 0; for (block = 0; block < 9; ++block){ block_row = (block / 3) * 3, block_col = (block % 3) * 3; memset(count, 0, 9 * sizeof(int)); for (row = block_row; row < (block_row + 3); ++row) for (col = block_col; col < (block_col + 3); ++col) if (sudoku[row][col] != '.') ++count[sudoku[row][col] - '1']; for (i = 0; i < 9; ++i) if (count[i] > 1) return false; } return true; } int main(){ vector<vector<char> > sudoku= { {'5','3','.','.','7','.','.','.','.'}, {'6','.','.','1','9','5','.','.','.'}, {'.','9','8','.','.','.','.','6','.'}, {'8','.','.','.','6','.','.','.','3'}, {'4','.','.','8','.','3','.','.','1'}, {'7','.','.','.','2','.','.','.','6'}, {'.','6','.','.','.','.','2','8','.'}, {'.','.','.','4','1','9','.','.','5'}, {'.','.','.','.','8','.','.','7','9'} }; bool ans= validSudoku(sudoku); if(ans){ cout<<"True"<<endl; } else { cout<<"false"<<endl; } return 0; }
ผลลัพธ์
True