LeetCode051 N-Queens
来源:互联网 发布:linux tomcat环境变量 编辑:程序博客网 时间:2024/06/01 10:11
详细见:leetcode.com/problems/n-queens
Java Solution: github
package leetcode;import java.util.LinkedList;import java.util.List;public class P051_NQueens {public static void main(String[] args) {//Queen queen = new Queen();//queen.backtrack(1);System.out.println(new Solution2().solveNQueens(8).size());}/* * 4 ms * 91.55% */static class Solution1 {List<List<String>> ans = new LinkedList<List<String>>();int[] col = null, rup = null, lup = null, row = null;public List<List<String>> solveNQueens(int n) {if (n < 1)return ans;col = new int[n];row = new int[n];rup = new int[(n << 1) - 1];lup = new int[rup.length];search(0);return ans;}private void search(int index) {if (index == col.length) {List<String> answer = new LinkedList<String>();char[] cs = new char[index];for (int i = 0; i != index; i ++) {for (int j = 0; j != index; j ++)cs[j] = j == row[i] ? 'Q' : '.';answer.add(new String(cs));}ans.add(answer);return;}for (int i = 0; i != col.length; i ++) {if (col[i] == 0 && lup[index + i] == 0 && rup[col.length - 1 + index - i] == 0) {col[i] = lup[index + i] = rup[col.length - 1 + index - i] = 1;row[index] = i;search(index + 1);col[i] = lup[index + i] = rup[col.length - 1 + index - i] = 0;}}}}/* * 3 ms * 97.29% */static class Solution2 {List<List<String>> ans = new LinkedList<List<String>>();boolean[] col = null, rup = null, lup = null;int[] row = null;public List<List<String>> solveNQueens(int n) {if (n < 1)return ans;col = new boolean[n];row = new int[n];rup = new boolean[(n << 1) - 1];lup = new boolean[rup.length];search(0);return ans;}private void search(int index) {if (index == col.length) {List<String> answer = new LinkedList<String>();char[] cs = new char[index];for (int i = 0; i != index; i ++) {for (int j = 0; j != index; j ++)cs[j] = j == row[i] ? 'Q' : '.';answer.add(new String(cs));}ans.add(answer);return;}for (int i = 0; i != col.length; i ++) {if (! col[i] && ! lup[index + i] && ! rup[col.length - 1 + index - i]) {col[i] = lup[index + i] = rup[col.length - 1 + index - i] = true;row[index] = i;search(index + 1);col[i] = lup[index + i] = rup[col.length - 1 + index - i] = false;}}}}}
C Solution: github
/* url: leetcode.com/problems/n-queens/ AC 6ms 16.67% AC 3ms 50.00%*/#include <stdio.h>#include <stdlib.h>//array list starttypedef char** T;typedef struct al sal;typedef struct al * pal;struct al { int capacity; int size; T* arr;};void al_expand_capacity(pal l) { T* new_arr = (T*) malloc(sizeof(T) * (l->capacity * 2 + 1)); int i = 0; for (i = 0; i < l->capacity; i ++) new_arr[i] = l->arr[i]; free(l->arr); l->arr = new_arr; l->capacity = l->capacity * 2 + 1;}void al_add_last(pal l, T v) { if (l->capacity == l->size) al_expand_capacity(l); l->arr[l->size] = v; l->size ++;}void al_add_to_index(pal l, T v, int index) { int i = 0; if (index > l->size) return; if (l->capacity == l->size) al_expand_capacity(l); for (i = l->size - 1; i >= index; i --) { l->arr[i+1] = l->arr[i]; } l->arr[index] = v; l->size ++;}T* al_convert_to_array_free_l(pal l) { T* arr = l->arr; free(l); return arr;}T al_access_by_index(pal l, int index) { if (index >= l->size || index < 0) return 0; return l->arr[index];}//array list endint valid(char** save, int i, int j, int n) { int k = 0, ii = 0, jj = 0; for (k = 0; k < n; k ++) { if (k != i && save[k][j] == 'Q') return 0; if (k != j && save[i][k] == 'Q') return 0; } ii = i + 1; jj = j + 1; while (ii < n && jj < n) { if (save[ii][jj] != 'Q') { ii ++; jj ++; } else return 0; } ii = i - 1; jj = j - 1; while (ii > -1 && jj > -1) { if (save[ii][jj] != 'Q') { ii --; jj --; } else return 0; } ii = i + 1; jj = j - 1; while (ii < n && jj > -1) { if (save[ii][jj] != 'Q') { ii ++; jj --; } else return 0; } ii = i - 1; jj = j + 1; while (ii > -1 && jj < n) { if (save[ii][jj] != 'Q') { ii --; jj ++; } else return 0; } return 1;}void solve(pal l, char** save, int row, int n) { char** temp = NULL, *temp_row = NULL; int i = 0, j = 0, col = 0; if (row == n) { temp = (char**) malloc(sizeof(char*) * n);; for (i = 0; i < n; i ++) { temp_row = (char*) malloc(sizeof(char) * (n+1)); for (j = 0; j < n; j ++) temp_row[j] = save[i][j]; temp_row[n] = '\0'; temp[i] = temp_row; } al_add_last(l, temp); return; } for (col = 0; col < n; col ++) { if (valid(save, row, col, n)) { save[row][col] = 'Q'; solve(l, save, row+1, n); save[row][col] = '.'; } }}char*** solveNQueens(int n, int* r) { char** save = (char**) malloc(sizeof(char*) * n); char* save_row = NULL; int i = 0, j = 0; pal l = (pal) malloc(sizeof(sal)); l->size = 0; l->capacity = 16; l->arr = (T*) malloc(sizeof(T) * l->capacity); for (i = 0; i < n; i ++) { save_row = (char*) malloc(sizeof(char) * (n+1)); for (j = 0; j < n; j ++) save_row[j] = '.'; save_row[n] = '\0'; save[i] = save_row; } solve(l, save, 0, n); *r = l->size; return al_convert_to_array_free_l(l);}void solve2(pal l, char** save, int row, int n, int* col_sign, int* lup_sign, int* rup_sign) { char** temp = NULL, *temp_row = NULL; int i = 0, j = 0, col = 0; if (row == n) { temp = (char**) malloc(sizeof(char*) * n);; for (i = 0; i < n; i ++) { temp_row = (char*) malloc(sizeof(char) * (n+1)); for (j = 0; j < n; j ++) temp_row[j] = save[i][j]; temp_row[n] = '\0'; temp[i] = temp_row; } al_add_last(l, temp); return; } for (col = 0; col < n; col ++) { if (!col_sign[col] && !lup_sign[col - row + n - 1] && !rup_sign[row + col]) { col_sign[col] = lup_sign[col - row + n - 1] = rup_sign[row + col] = 1; save[row][col] = 'Q'; solve2(l, save, row+1, n, col_sign, lup_sign, rup_sign); save[row][col] = '.'; col_sign[col] = lup_sign[col - row + n - 1] = rup_sign[row + col] = 0; } }}char*** solveNQueens2(int n, int* r) { char** save = (char**) malloc(sizeof(char*) * n); char* save_row = NULL; int i = 0, j = 0; pal l = (pal) malloc(sizeof(sal)); int *col_sign = NULL, *lup_sign = NULL, *rup_sign = NULL; l->size = 0; l->capacity = 16; l->arr = (T*) malloc(sizeof(T) * l->capacity); col_sign = (int*) malloc(sizeof(int) * n); lup_sign = (int*) malloc(sizeof(int) * (2 * n - 1)); rup_sign = (int*) malloc(sizeof(int) * (2 * n - 1)); for (i = 0; i < n; i ++) col_sign[i] = 0; for (i = 0; i < 2 * n - 1; i ++) lup_sign[i] = 0; for (i = 0; i < 2 * n - 1; i ++) rup_sign[i] = 0; for (i = 0; i < n; i ++) { save_row = (char*) malloc(sizeof(char) * (n+1)); for (j = 0; j < n; j ++) save_row[j] = '.'; save_row[n] = '\0'; save[i] = save_row; } solve2(l, save, 0, n, col_sign, lup_sign, rup_sign); *r = l->size; free(col_sign); free(lup_sign); free(rup_sign); return al_convert_to_array_free_l(l);}int main() { int r = 0; int n = 13; int i = 0; int j = 0; char*** ans = NULL; for (n = 1; n < 7; n ++) { ans = solveNQueens2(n, &r); printf("n is %d r is %d\r\n", n, r); for (i = 0; i < r; i ++) { for (j = 0; j < n; j ++) { printf("%s\r\n", ans[i][j]); free(ans[i][j]); } printf("=======================\r\n"); } free(ans); }}
Python Solution: github
#coding=utf-8''' url: leetcode.com/problems/n-queens @author: zxwtry @email: zxwtry@qq.com @date: 2017年4月9日 @details: Solution: 92ms 83.33%'''class Solution(object): def search(self, a, c, l, r, i, n, rec): if i == n: a_t,a_j=[],['.']*8 for j in range(n): for j in range(n): a_j[j]=(rec[j][j]) a_t.append("".join(a_j)) a.append(a_t) return for j in range(n): if not c[j] and not l[j+i] and not r[j-i+n-1]: c[j]=l[j+i]=r[j-i+n-1]=True rec[i][j]='Q' self.search(a, c, l, r, i+1, n, rec) c[j]=l[j+i]=r[j-i+n-1]=False rec[i][j]='.' def solveNQueens(self, n): """ :type n: int :rtype: List[List[str]] """ a,c,l,r=[],[False]*n,[False]*(2*n-1),[False]*(2*n-1) rec=[['.' for i in range(n)] for j in range(n)] self.search(a, c, l, r, 0, n, rec) return aif __name__ == "__main__": print(Solution().solveNQueens(5))
0 0
- LeetCode051 N-Queens
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- N-queens
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- C++实现二叉树的插入、删除、查询、遍历
- 基于视频压缩的实时监控系统-A0:目录
- oracle 非常完整的总结
- opencv+Recorder︱OpenCV 中使用 Haar 分类器进行面部检测
- Unity3D---技能释放的效果
- LeetCode051 N-Queens
- okhttp 过滤器 Interceptors 中读取ResonseBody
- 关于sql攻击的处理方式
- 网络编程----libevent改造Echo服务器
- sql 语句练习
- ES6声明变量的六种方法
- HDU 2077汉诺塔IV
- 2017/04/08 蓝桥杯结束——————————————————
- poj 1504 水题