LeetCode N-Queens

来源:互联网 发布:统计数据 观测数据 编辑:程序博客网 时间:2024/05/22 00:44

还记得第一次遇见这题时,本科刚学数据结构时,有个周末一人拎个笔记本在林大二教调了整整一小天,那是八皇后的问题,只记得第一次调通的兴奋,至于内容全忘了。这题刚开始理解错了,以为皇后只是横竖能走,斜着不能走,所以刚开始的思路是用一个一维数组,下标是皇后所在的行,值是所在的列,这样类似求全排列的方式,应该是有多少种全排列就有多少种布局的方式,当然这是错的,不过思路仍然可以用,只是在放入解的时候多判断一下是不是不符合的布局(这部只判断斜着的就行了)。做是做出来了,就是提交时莫名的错误,说是输入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";elsetemp += ".";}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[n];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[n]) {return false;}if(abs(queens[i] - queens[n]) == (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";elsetemp += ".";}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[n];onesolu(arr,n,0,ret);//onesolu(arr,n,0);delete[] arr;return ret;}



0 0
原创粉丝点击