class Solution {
LinkedList<String> res = new LinkedList<>();
LinkedList<String> path = new LinkedList<>();
public List<String> findItinerary(List<List<String>> tickets) {
Collections.sort(tickets, (a, b) -> a.get(1).compareTo(b.get(1)));
path.add("JFK");
boolean[] used = new boolean[tickets.size()];
backtrack((ArrayList) tickets, used);
return res;
}
private boolean backtrack(ArrayList<List<String>> tickets, boolean[] used){
if(path.size() == tickets.size() + 1){
res = new LinkedList(path);
return true;
}
for(int i = 0; i < tickets.size(); i++){
if(!used[i] && tickets.get(i).get(0).equals(path.getLast())){
path.add(tickets.get(i).get(1));
used[i] = true;
if(backtrack(tickets, used))return true;
used[i] = false;
path.removeLast();
}
}
return false;
}
}
class Solution {
List<List<String>> res = new ArrayList<>();
public List<List<String>> solveNQueens(int n) {
List<String> board = new ArrayList<>();
StringBuilder sb = new StringBuilder();
for(int i = 0; i < n; i++){
sb.append('.');
}
for(int i = 0; i < n; i++){
board.add(sb.toString());
}
backtrack(board, 0);
return res;
}
private void backtrack(List<String> board, int row){
if(row == board.size()){
res.add(new ArrayList<>(board));
return;
}
int n = board.get(row).length();
for(int col = 0; col < n; col++){
if(!isValid(board, row, col))continue;
char[] arr = board.get(row).toCharArray();
arr[col] = 'Q';
board.set(row, String.valueOf(arr));
backtrack(board, row + 1);
arr[col] = '.';
board.set(row, String.valueOf(arr));
}
}
private boolean isValid(List<String> board, int row, int col){
int n = board.size();
for(int i = 0; i < n; i++){
if(board.get(i).charAt(col) == 'Q')return false;
}
for(int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++){
if(board.get(i).charAt(j) == 'Q')return false;
}
for(int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--){
if(board.get(i).charAt(j) == 'Q')return false;
}
return true;
}
}
class Solution {
public void solveSudoku(char[][] board) {
backtrack(board);
}
private boolean backtrack(char[][] board){
for(int i = 0; i < board.length; i++){
for(int j = 0; j < board[0].length; j++){
if(board[i][j] == '.'){
for(char k = '1'; k <= '9'; k++){
if(isValid(i, j, k, board)){
board[i][j] = k;
if(backtrack(board))return true;
board[i][j] = '.';
}
}
return false;
}
}
}
return true;
}
private boolean isValid(int row, int col, char val, char[][] board){
for(int j = 0; j < 9; j++){
if(board[row][j] == val)return false;
}
for(int i = 0; i < 9; i++){
if(board[i][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;
}
}