LeetCode N-Queens
2013-12-29 10:31
357 查看
还记得第一次遇见这题时,本科刚学数据结构时,有个周末一人拎个笔记本在林大二教调了整整一小天,那是八皇后的问题,只记得第一次调通的兴奋,至于内容全忘了。这题刚开始理解错了,以为皇后只是横竖能走,斜着不能走,所以刚开始的思路是用一个一维数组,下标是皇后所在的行,值是所在的列,这样类似求全排列的方式,应该是有多少种全排列就有多少种布局的方式,当然这是错的,不过思路仍然可以用,只是在放入解的时候多判断一下是不是不符合的布局(这部只判断斜着的就行了)。做是做出来了,就是提交时莫名的错误,说是输入4时,结果为空。可是在本地调的一点问题都没有,和别的程序比较了,输出结果完全一样,那两个程序都是用了全局变量,难道这是原因,怀疑LeetCode的编译器。不多说,还是相信自己的一点问题没有,如下:
做到第二题时终于明白了为什么我的提交不过,其实是超时,编译器提示错误,做了一处优化就好了。如下:
// LeetCode_N-Queens.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <vector> #include <iostream> #include <string> using namespace std; bool isvalid(int *arr,int n) { for(int i=0;i<n;i++) { for (int k=1;k<n;k++) { if (i+k - i == abs(arr[i+k] - arr[i]))//只判断对角线 { return false; } } } return true; } bool isPut(int *arr,int n,int i,int value) { for (int j=0;j<i;j++) { if (arr[j]==value) { return false; } } return true; } void onesolu(int *arr,int n,int i,vector<vector<string> > &ret)// { if (i==n&&isvalid(arr,n)) { vector<string> onesolut; for (int k=0;k<n;k++) { string temp=""; for (int j=0;j<n;j++) { if (j==arr[k]) temp += "Q"; else temp += "."; } onesolut.push_back(temp); } //oneans = onesolut; ret.push_back(onesolut); return ; } for (int j=0;j<n;j++) { if (isPut(arr,n,i,j)) { arr[i] = j; onesolu(arr,n,i+1,ret);//?onesolu(arr,n,i+1); } } } vector<vector<string> > solveNQueens1(int n) { vector<vector<string> >ret; int *arr = new int ; onesolu(arr,n,0,ret);// onesolu(arr,n,0); delete[] arr; return ret; } ////////////////////////////////////////////////////////////////////////// /* vector<vector<string>> res; void permutationHelper(vector<int> &nums, int index, int n) { if(index == n) { bool flag = true; for(int i = 0; i<n && flag; i++) for(int j=i+1; j<n; j++) if((j-i) == abs(nums[j]-nums[i])) { flag = false; break; } if(flag) { vector<string> tmp; for(int i =0; i<n;i++) { string row(n,'.'); row[nums[i]]='Q'; tmp.push_back(row); } res.push_back(tmp); } } for(int i = index; i < n; i++) { swap(nums[index], nums[i]); permutationHelper(nums, index+1, n); swap(nums[index], nums[i]); } } void permutation(int n) { vector<int> nums(n); for(int i = 0; i < n; i++) nums[i] = i; permutationHelper(nums,0,n); } vector<vector<string> > solveNQueens(int n) { // Note: The Solution object is instantiated only once. res.clear(); permutation(n); return res; } */ ////////////////////////////////////////////////////////////////////////// vector<int> queens; vector<vector<int> > sols; bool is_valid(int n) { int i = 0, j = 0; for(i = 0; i < n; ++i) { if(queens[i] == queens ) { return false; } if(abs(queens[i] - queens ) == (n - i)) { return false; } } return true; } void place_queen(int i, int n) { if(i == n) { sols.push_back(queens); return; } int j = 0; for(j = 0; j < n; ++j) { queens[i] = j; if(is_valid(i)) place_queen(i+1, n); } } vector<vector<string> > solveNQueens(int n) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. int i = 0, cnt = 0; for(i = 0; i < n; ++i) { queens.push_back(0); } place_queen(0, n); string str; vector<string> svec; vector<vector<string> > svvec; for(vector<vector<int> >::iterator vv_iter = sols.begin(); vv_iter != sols.end(); ++vv_iter) { svec.clear(); for(vector<int>::iterator v_iter = (*vv_iter).begin(); v_iter != (*vv_iter).end(); ++v_iter) { str.clear(); for(i = 0; i < n; ++i) { if(*v_iter == i) { str.push_back('Q'); } else { str.push_back('.'); } } svec.push_back(str); } svvec.push_back(svec); } return svvec; } ////////////////////////////////////////////////////////////////////////// int _tmain(int argc, _TCHAR* argv[]) { int n; vector<vector<string> >ret,ret1; vector<vector<string> >::iterator iter1,iter11; vector<string>::iterator iter2,iter22; while(cin>>n) { queens.clear(); sols.clear(); ret = solveNQueens(n); iter1 = ret.begin(); while(iter1!=ret.end()) { iter2 = (*iter1).begin(); while(iter2!=(*iter1).end()) { cout<<*iter2<<endl; iter2++; } cout<<endl<<endl; iter1++; } ret1 = solveNQueens1(n); iter11 = ret1.begin(); while(iter11!=ret1.end()) { iter22 = (*iter11).begin(); while(iter22!=(*iter11).end()) { cout<<*iter22<<endl; iter22++; } cout<<endl<<endl; iter11++; } } system("pause"); return 0; }
做到第二题时终于明白了为什么我的提交不过,其实是超时,编译器提示错误,做了一处优化就好了。如下:
bool isvalidEachLine(int *arr,int n,int j) { for (int i=0;i<j;i++) { if (j-i == abs(arr[j]-arr[i])) { return false; } } return true; } bool isPut(int *arr,int n,int i,int value) { for (int j=0;j<i;j++) { if (arr[j]==value) { return false; } } return true; } void onesolu(int *arr,int n,int i,vector<vector<string> > &ret)// { if (i==n)//&&isvalid(arr,n) { vector<string> onesolut; for (int k=0;k<n;k++) { string temp=""; for (int j=0;j<n;j++) { if (j==arr[k]) temp += "Q"; else temp += "."; } onesolut.push_back(temp); } //oneans = onesolut; ret.push_back(onesolut); return ; } for (int j=0;j<n;j++) { if (isPut(arr,n,i,j)) { arr[i] = j; if (isvalidEachLine(arr,n,i)) { onesolu(arr,n,i+1,ret);//?onesolu(arr,n,i+1); } } } } vector<vector<string> > solveNQueens(int n) { vector<vector<string> >ret; int *arr = new int ; onesolu(arr,n,0,ret);// onesolu(arr,n,0); delete[] arr; return ret; }
相关文章推荐
- [leetcode]N-Queens
- N-Queens II leetcode java
- LeetCode || N-Queens
- n皇后问题的递归和迭代版 leetcode N-Queens
- LeetCode - N-Queens
- [leetcode]N-Queens @ Python
- LeetCode 51.N-Queens
- LeetCode Online Judge 题目C# 练习 - N-Queens
- leetcode-N-Queens 搜索
- 【LeetCode】51. N-Queens
- leetcode51/52-N-Queens I/II(n皇后问题)
- N 皇后问题 : Leetcode 51. N-Queens
- leetcode—N-Queens系列
- LeetCode - N-Queens I && II
- [leetcode]N-Queens
- LeetCode 51 N-Queens
- LeetCode: 【L4】N-Queens 解题报告
- 【LeetCode】51.N-Queens(hard)解题报告
- [leetcode]N-Queens
- LeetCode—51.N-Queens