Coffe_Bên_Lề
Senior Member
em nghĩ là nó muốn đẩy sự khổ dâm đến tột độBài toán rẻ rách thật sự![]()
em nghĩ là nó muốn đẩy sự khổ dâm đến tột độBài toán rẻ rách thật sự![]()
Input: board = [["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"]]
Output: [["5","3","4","6","7","8","9","1","2"],["6","7","2","1","9","5","3","4","8"],["1","9","8","3","4","2","5","6","7"],["8","5","9","7","6","1","4","2","3"],["4","2","6","8","5","3","7","9","1"],["7","1","3","9","2","4","8","5","6"],["9","6","1","5","3","7","2","8","4"],["2","8","7","4","1","9","6","3","5"],["3","4","5","2","8","6","1","7","9"]]
Hôm nay pick random được bài này, tạm thời post đề trước, solution sauDùng backtracking nhéĐộ khó: HARD
Đề bài: viết một chương trình để giải trò chơi Sudoku bằng cách điền vào ô trống
Một đáp án đúng cho trò Sudoku này là:
1/Các số từ 1 đến 9 chỉ xuất hiện đúng 1 lần trong 1 cột
2/Các số từ 1 đến 9 chỉ xuất hiện đúng 1 lần trong 1 hàng
3/Các số từ 1 đến 9 chỉ xuất hiện đúng 1 lần trong một ô vuông con có kích thước 3 X 3
Ký tự "." (dấu chấm) đại diện cho ô trống
Ví dụ:
![]()
![]()
Giới hạn:
- Chiều dài bảng input = 9
- Chiều rộng bảng input = 9
- Các ô đều là số hoặc dấu chấm
- Đầu vào được đảm bảo chỉ có 1 đáp số duy nhất
https://leetcode.com/problems/sudoku-solver/
Hôm nay pick random được bài này, tạm thời post đề trước, solution sau


Bài toán này chỉ có mỗi backtracking chứ chưa có giải thuật nào tốt hơn thì phải ?Dùng backtracking nhé
t cũng k biết cách khác, hóng cao nhân.Bài toán này chỉ có mỗi backtracking chứ chưa có giải thuật nào tốt hơn thì phải ?


class Solution {
public:
void solveSudoku(vector<vector<char>>& board) {
solveSudokuRecursive(board);
}
bool solveSudokuRecursive(vector<vector<char>>& board, int start_i = 0) {
for (int i = start_i; i< 9; i++) {
for (int j = 0; j < 9; j++) {
if (board[i][j] == '.'){
vector<bool> presented(9,false);
getPresentMap(board, presented, i, j);
for (int k = 0; k < presented.size(); k++){
if (!presented[k]) {
board[i][j] = k + '1';
if (solveSudokuRecursive(board, i)){
return true;
}
board[i][j] = '.';
}
}
return false;
}
}
}
return true;
}
void getPresentMap(const vector<vector<char>>& board, vector<bool> &presented, int i, int j){
for (int m = 0; m < 9; m++){
if (board[i][m] >= '1' && board[i][m] <= '9'){
presented[board[i][m] - '1'] = true;
}
if (board[m][j] >= '1' && board[m][j] <= '9'){
presented[board[m][j] - '1'] = true;
}
}
int start_i = i/3*3;
int start_j = j/3*3;
for (int i = start_i; i < start_i + 3; i++){
for (int j = start_j; j < start_j + 3; j++){
if (board[i][j] >= '1' && board[i][j] <= '9'){
presented[board[i][j] - '1'] = true;
}
}
}
}
};
Thím thử tìm cách convert để run parallel xem.t cũng k biết cách khác, hóng cao nhân.
Bài này t làm lâu rồi, thấy nó ngang với medium thôi, chứ chưa phải hard.
C++:class Solution { public: void solveSudoku(vector<vector<char>>& board) { solveSudokuRecursive(board); } bool solveSudokuRecursive(vector<vector<char>>& board, int start_i = 0) { for (int i = start_i; i< 9; i++) { for (int j = 0; j < 9; j++) { if (board[i][j] == '.'){ vector<bool> presented(9,false); getPresentMap(board, presented, i, j); for (int k = 0; k < presented.size(); k++){ if (!presented[k]) { board[i][j] = k + '1'; if (solveSudokuRecursive(board, i)){ return true; } board[i][j] = '.'; } } return false; } } } return true; } void getPresentMap(const vector<vector<char>>& board, vector<bool> &presented, int i, int j){ for (int m = 0; m < 9; m++){ if (board[i][m] >= '1' && board[i][m] <= '9'){ presented[board[i][m] - '1'] = true; } if (board[m][j] >= '1' && board[m][j] <= '9'){ presented[board[m][j] - '1'] = true; } } int start_i = i/3*3; int start_j = j/3*3; for (int i = start_i; i < start_i + 3; i++){ for (int j = start_j; j < start_j + 3; j++){ if (board[i][j] >= '1' && board[i][j] <= '9'){ presented[board[i][j] - '1'] = true; } } } } };
Mình thấy bài này mức độ TB thôi, chưa phải khó, bài sử dụng quay lui khó phải có 2, 3 cái quay lui lồng vào nhau cơĐộ khó: HARD
Đề bài: viết một chương trình để giải trò chơi Sudoku bằng cách điền vào ô trống
Một đáp án đúng cho trò Sudoku này là:
1/Các số từ 1 đến 9 chỉ xuất hiện đúng 1 lần trong 1 cột
2/Các số từ 1 đến 9 chỉ xuất hiện đúng 1 lần trong 1 hàng
3/Các số từ 1 đến 9 chỉ xuất hiện đúng 1 lần trong một ô vuông con có kích thước 3 X 3
Ký tự "." (dấu chấm) đại diện cho ô trống
Ví dụ:
![]()
![]()
Giới hạn:
- Chiều dài bảng input = 9
- Chiều rộng bảng input = 9
- Các ô đều là số hoặc dấu chấm
- Đầu vào được đảm bảo chỉ có 1 đáp số duy nhất
https://leetcode.com/problems/sudoku-solver/
Hôm nay pick random được bài này, tạm thời post đề trước, solution sau
Ủa cho ví dụ đi thím ?Mình thấy bài này mức độ TB thôi, chưa phải khó, bài sử dụng quay lui khó phải có 2, 3 cái quay lui lồng vào nhau cơ
đây nha bạnỦa cho ví dụ đi thím ?
Không có cách nào đâu. Nắm chắc lý thuyết và làm thật nhiều. Nhưng chỉ nắm được kiến thức cơ bản thôi.làm thế nào luyện mấy bài thuật toán khó thế nhỉ
tớ thấy nó khó vãi, đi làm chắc gì đã dùng.Không có cách nào đâu. Nắm chắc lý thuyết và làm thật nhiều. Nhưng chỉ nắm được kiến thức cơ bản thôi.
thì đa phần là không dùng, hoặc có dùng (ít) mà bạn không để ýtớ thấy nó khó vãi, đi làm chắc gì đã dùng.

Độ khó: HARD
Đề bài: viết một chương trình để giải trò chơi Sudoku bằng cách điền vào ô trống
Một đáp án đúng cho trò Sudoku này là:
1/Các số từ 1 đến 9 chỉ xuất hiện đúng 1 lần trong 1 cột
2/Các số từ 1 đến 9 chỉ xuất hiện đúng 1 lần trong 1 hàng
3/Các số từ 1 đến 9 chỉ xuất hiện đúng 1 lần trong một ô vuông con có kích thước 3 X 3
Ký tự "." (dấu chấm) đại diện cho ô trống
Ví dụ:
![]()
![]()
Giới hạn:
- Chiều dài bảng input = 9
- Chiều rộng bảng input = 9
- Các ô đều là số hoặc dấu chấm
- Đầu vào được đảm bảo chỉ có 1 đáp số duy nhất
https://leetcode.com/problems/sudoku-solver/
Hôm nay pick random được bài này, tạm thời post đề trước, solution sau

Cóem mới tự học lại giải thuật quy hoạch động, có 1 thắc mắc là có cần thiết lúc nào cũng phải chuyển lời giải đệ quy sang iterative(loop, white) ko các bác
bất cứ khi nào có thểcó tips hay tài liệu nào để tham khảo chuyển đổi đệ quy sang loop ko bác :stick:Cóbất cứ khi nào có thể
Vì nếu recursion quá sâu thì sẽ gặp đủ thứ lỗi mà cách giải quyết tốt nhất vẫn là đừng đệ quy