コードカプリスアルゴリズム合宿 30日目|332. スケジュール変更51. クイーンN37. 数独を解く

目次

LeeCode 332. スケジュール変更

LeeCode 51. クイーン N

LeeCode 37. 数独を解く


LeeCode 332. スケジュール変更

332. 旅程の再調整 - LeetCode

class Solution {
private:
    unordered_map<string, map<string, int>> targets;
	bool backtracking(int ticketNum, vector<string>& result) {
		if (result.size() == ticketNum + 1) return true;
		for (pair<const string, int>& target : targets[result[result.size() - 1]]) {
			if (target.second > 0) {
				result.push_back(target.first);
				target.second--;
				if (backtracking(ticketNum, result)) return true;
				result.pop_back();
				target.second++;
			}
		}
		return false;
	} 
public:
    vector<string> findItinerary(vector<vector<string>>& tickets) {
    	targets.clear();
		vector<string> result;
		for (const vector<string>& vec : tickets) targets[vec[0]][vec[1]]++;
		result.push_back("JFK");
		backtracking(tickets.size(), result);
		return result;
    }
};

LeeCode 51. クイーン N

51. クイーンN - LeetCode

class Solution {
private:
    vector<vector<string>> result;
	void backtracking(int n, int row, vector<string>& chessboard) {
		if (row == n) {
			result.push_back(chessboard);
			return;
		}
		for (int col = 0; col < n; col++) {
			if (isValid(row, col, chessboard, n)) {
				chessboard[row][col] = 'Q';
				backtracking(n, row + 1, chessboard);
				chessboard[row][col] = '.';
			}
		}
	} 
	bool isValid(int row, int col, vector<string>& chessboard, int n) {
		for (int i = 0; i < row; i++) {
			if (chessboard[i][col] == 'Q' ) return false;
		}
		for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
			if (chessboard[i][j] == 'Q') return false;
		}
		for (int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {
			if (chessboard[i][j] == 'Q') return false;
		}
		return true;
	}
	
public:
    vector<vector<string>> solveNQueens(int n) {
    	result.clear();
    	std::vector<std::string> chessboard(n, std::string(n, '.'));
    	backtracking(n, 0, chessboard);
    	return result;
    }
};

LeeCode 37. 数独を解く

37. 数独を解く - LeetCode

class Solution {
private:
	bool backtracking(vector<vector<char>>& board) {
		for (int i = 0; i < board.size(); i++) {
			for (int j = 0; j < board[0].size(); j++) {
				if (board[i][j] == '.') {
					for (char k = '1'; k <= '9'; k++) {
						if (isValid(i, j, k, board)) {
							board[i][j] = k;
							if (backtracking(board)) return true;
							board[i][j] = '.';
						}
					}
					return false;//1-9都不行,说明无解,返回false 
				}
			}
		}
		return true; 
	}
	bool isValid(int row, int col, char val, vector<vector<char>>& board) {
		for (int i = 0; i < 9; i++) {
			if (board[row][i] == val) return false;
		}
		for (int j = 0; j < 9; j++){
			if (board[j][col] == val) return false;
		}
		int startRow = (row / 3) * 3;
		int startCol = (col / 3) * 3;
		for (int i = startRow; i < startRow + 3; i++) {
			for (int j = startCol; j < startCol + 3; j++) {
				if (board[i][j] == val) return false;
			}
		}
		return true;
	}
public:
    void solveSudoku(vector<vector<char>>& board) {
    	backtracking(board);
    }
};

最初のブラシは主にアイデアを理解するためのものですが、コードを再度入力するだけです。

おすすめ

転載: blog.csdn.net/weixin_74976519/article/details/130744509