zoukankan      html  css  js  c++  java
  • backtracing

    5月10日

    1 37  Sudoku Slover

     public void solveSudoku(char[][] board) {
            if(board == null || board.length == 0)
                return;
            slove(board);
        }
        public boolean slove(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 c = '1'; c <= '9'; c++)
                        {
                            if (isValue(board, i, j, c))
                            {
                                board[i][j] = c;
                                if (slove(board))
                                    return true;
                                else 
                                    board[i][j] = '.';
                            }
                        }
                        return false;
                    }
                }
            }
            return true;
        }
        public boolean isValue(char[][] board, int row, int col, char c)
        {
            for (int i = 0; i < 9; i++)
            {
                if (board[i][col] != '.' && board[i][col] == c) return false;
                 if (board[row][i] != '.' && board[row][i] == c) return false;
                 if (board[3 * (row/3) + i/3][3 *(col/3) + i % 3] != '.' &&
                 board[3 * (row/3) + i/3][3 *(col/3) + i % 3] == c) return false;
            }
            return true;
        }
    View Code

    2 51 N-Queens

      public List<List<String>> solveNQueens(int n) {
            List<List<String>> res = new ArrayList<>();
            help(n, 0, new int[n], res);
            return res;
        }
        public void help(int n, int row, int[] colforrow, List<List<String>> res)
        {
            if (row == n)
            {
                ArrayList<String> item = new ArrayList<>();
                for (int i = 0; i < n; i++)
                {
                    StringBuilder sb = new StringBuilder();
                    for (int j = 0; j < n; j++)
                    {
                        if (colforrow[i] == j)
                            sb.append('Q');
                        else 
                            sb.append('.');
                    }
                    item.add(sb.toString());
                }
                res.add(item);
                return;
            }
            for (int i = 0; i < n; i++)
            {
                colforrow[row] = i;
                if (check(row, colforrow))
                {
                    help(n, row + 1, colforrow, res);
                }
            }
        }
    View Code

    3 52 N-Queens II

        public int totalNQueens(int n) {
            ArrayList<Integer> res = new ArrayList<>();
            res.add(0);
            help(n, 0, new int[n], res);
            return res.get(0);
        }
        private void help(int n, int row, int[] columnForRow, ArrayList<Integer> res)  
       {  
        if(row==n)  
        {  
            res.set(0,res.get(0)+1);  
            return;  
        }  
        for(int i=0;i<n;i++)  
        {  
            columnForRow[row]=i;  
            if(check(row,columnForRow))  
            {  
                help(n,row+1,columnForRow,res);  
            }  
        }  
    }  
    private boolean check(int row, int[] columnForRow)  
    {  
        for(int i=0;i<row;i++)  
        {  
            if(columnForRow[i]==columnForRow[row] || Math.abs(columnForRow[row]-columnForRow[i])==row-i)  
                return false;  
        }  
        return true;  
    } 
    View Code

    4 77  combinations  分子问题

        public List<List<Integer>> combine(int n, int k) {
            List<List<Integer>> res = new ArrayList<>();
            if (n <= 0 || n < k) return res;
            help(n, k, 1, new ArrayList<Integer>(), res);
            return res;
        }
        public void help(int n, int k, int start, ArrayList<Integer> item, List<List<Integer>> res)
        {
            if (item.size() == k)
            {
                res.add(new ArrayList<Integer>(item));
                return;
            }
            for (int i = start; i <= n; i++)
            {
                item.add(i);
                help(n, k, i + 1, item, res);
                item.remove(item.size() - 1);
            }
        }
    View Code

     5 89 Gray Code

        public List<Integer> grayCode(int n) {
            List<Integer> res = new ArrayList<>();
            res.add(0);
            for (int i = 0; i < n; i++)
            {
                int size = res.size();
                for (int k = size - 1; k >= 0; k--)
                {
                    res.add(res.get(k)|1<<i);
                }
            }
            return res;
        }
    View Code

    6 211 Add and search Word

    public class WordDictionary {
    
        public class TrieNode{
            public TrieNode[] children = new TrieNode[26];
            public String item = "";
        }
        private TrieNode root = new TrieNode();
        /** Initialize your data structure here. */
        public WordDictionary() {
        }
        
        /** Adds a word into the data structure. */
        public void addWord(String word) {
            TrieNode node = root;
            for (char c : word.toCharArray())
            {
                if (node.children[c - 'a'] == null)
                {
                    node.children[c - 'a'] = new TrieNode();
                }
                node = node.children[c - 'a'];
            }
            node.item = word;
        }
        
        /** Returns if the word is in the data structure. A word could contain the dot character '.' to represent any one letter. */
        public boolean search(String word) {
            return match(word.toCharArray(), 0, root);
        }
        private boolean match(char[] chs, int k, TrieNode node)
        {
            if (k == chs.length) return !node.item.equals("");
            if (chs[k] != '.')
            {
                return node.children[chs[k] - 'a'] != null && match(chs, k + 1, node.children[chs[k]-'a']);
            }
            else
            {
                for (int i = 0; i < node.children.length; i++)
                {
                    if (node.children[i] != null)
                    {
                        if (match(chs, k + 1, node.children[i]))
                            return true;
                    }
                }
            }
            return false;
        }
    }
    View Code

    7 212 Word Search II

        Set<String> res = new HashSet<>();
        public List<String> findWords(char[][] board, String[] words) {
            Trie trie = new Trie();
            for (String str : words)
            {
                trie.insert(str);
            }
            int m = board.length, n = board[0].length;
            boolean[][] visited = new boolean[m][n];
            for (int i = 0; i < m; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    dfs(board, visited, "", i, j, trie);
                }
            }
            return new ArrayList<String>(res);
        }
        public void dfs(char[][] board, boolean[][] visited, int i, int j, String item, Trie trie)
        {
            if (x < 0 || x >= board.length || y < 0 || y >= board[0].length) return;
            if (visited[i][j]) return;
            item += board[i][j];
            if (!trie.startsWith(item)) return;
            if (trie.search(item)) res.add(item);
            visited[i][j] = true;
            dfs(board, visited, i, j - 1, item, trie);
            dfs(board, visited, i, j + 1, item, trie);
            dfs(board, visited, i + 1, j, item, trie);
            dfs(board, visited, i - 1, j, item, trie);
            visited[i][j] = false;
        }
    View Code
  • 相关阅读:
    CH1301 邻值查找【set应用】
    poj1185 炮兵阵地【状压DP】
    codeforces#516 Div2---ABCD
    2017ACM-ICPC沈阳区域赛
    poj2411 Mondriaan's Dream【状压DP】
    hdu2196 Computer【树形DP】【换根法】
    poj3345 Bribing FIPA【树形DP】【背包】
    poj1463 Strategic game【树形DP】
    poj1191 棋盘分割【区间DP】【记忆化搜索】
    CH5E09 能量相连【区间DP】
  • 原文地址:https://www.cnblogs.com/whesuanfa/p/6835423.html
Copyright © 2011-2022 走看看