Leetcode N-Queens
来源:互联网 发布:amd游戏优化软件 编辑:程序博客网 时间:2024/06/07 03:05
The n-queens puzzle is the problem of placingn queens on an n×n chessboard such that no two queens attack each other.
Given an integer n, return all distinct solutions to then-queens puzzle.
Each solution contains a distinct board configuration of then-queens' placement, where 'Q'
and '.'
both indicate a queen and an empty space respectively.
For example,
There exist two distinct solutions to the 4-queens puzzle:
[ [".Q..", // Solution 1 "...Q", "Q...", "..Q."], ["..Q.", // Solution 2 "Q...", "...Q", ".Q.."]]
虽然不懂国际象棋,但它应该是可以攻击与它在同一行,同一列或对角线上的棋子。解题的方法就是递归大法。
代码如下:
class Solution {public: vector<vector<string>> solveNQueens(int n) { vector<vector<string>> result; vector<string> answer; int* visit = new int[n]; memset(visit,-1,sizeof(int)*n); for(int i=0;i<n;i++) { string temp = string(n,'.'); temp[i] = 'Q'; visit[i] = 0; answer.push_back(temp); Queens(result,answer,visit,i,1,n); visit[i] = -1; answer.pop_back(); } return result; } void Queens(vector<vector<string>>& result,vector<string>& answer,int* visit,int index,int count,int n) { if(count == n) { result.push_back(answer); return; } bool flag; for(int i =0;i<n;i++) { flag = true; string temp = string(n,'.'); if(visit[i] != -1) continue; for(int j=0;j<n;j++) { if(visit[j] != -1) { if(abs(count-visit[j]) == abs(i-j)) { flag = false; break; } } } if(flag == false) continue; temp[i] = 'Q'; visit[i] = count; answer.push_back(temp); Queens(result,answer,visit,i,count+1,n); visit[i] = -1; answer.pop_back(); } }};
看着自己的代码闻到一股shit的味道,要使代码更加优雅整洁,修改后的代码如下:
class Solution {public: vector<vector<string>> solveNQueens(int n) { vector<vector<string>> result; vector<string> answer(n,string(n,'.')); Queens(result,answer,0,n); return result; } bool valid(vector<string>& answer,int row,int col,int n) { for(int i=0;i<n;i++) if(answer[row][i] == 'Q') return false; for(int i=0;i<n;i++) if(answer[i][col] == 'Q') return false; for(int i=row,j=col;i>=0&&j>=0;i--,j--) if(answer[i][j] == 'Q') return false; for(int i=row,j=col;i>=0&&j<n;i--,j++) if(answer[i][j] == 'Q') return false; return true; } void Queens(vector<vector<string>>& result,vector<string>& answer,int row,int n) { if(row == n) { result.push_back(answer); return; } for(int col =0;col<n;col++) { if(valid(answer,row,col,n)) { answer[row][col] = 'Q'; Queens(result,answer,row+1,n); answer[row][col] = '.'; } } }};需要特别注意的是,在进行在斜线判断的时候,因为状态是从上一行往下一行传递,所以我们只需要判断45度和135度即可。
阅读全文
0 0
- 【LeetCode】N-Queens && N-Queens II
- leetcode N-Queens & N-Queens II
- Leetcode: N-Queens && N-Queens II
- 【Leetcode】【python】N-Queens/N-Queens II
- LeetCode: N-Queens II
- LeetCode: N-Queens
- LeetCode : N-Queens
- LeetCode : N-Queens II
- [Leetcode] N-Queens II
- leetcode 72: N-Queens
- LeetCode 38: N-Queens
- 【leetcode】N-Queens II
- 【leetcode】N-Queens
- LeetCode: N Queens II
- [LeetCode]N-Queens
- [LeetCode]N-Queens II
- [leetcode]N-Queens
- [LeetCode] Anagrams、N-Queens
- Canal之配置
- github设置添加SSH
- java关于try、catch、finally中的细节分析
- 《苏菲的世界》——读书笔记
- gulp-重构你的gulpfile
- Leetcode N-Queens
- C++的内存管理
- tensorflow构建神经网络文本分类1
- FormData详解
- ScrollView嵌套ListView一种简单解决方案
- CentOS Linux下VNC Server远程桌面配置详解
- 为什么在写中断函数时要写#pragma CODE_SEG __NEAR_SEG NON_BANKED这句话,是不是没什么实际作用的啊 '中断函数置于非分页区内'这是什么意思啊,非分页区是什么啊
- iOS runtime相关问题
- 智能卡