#include<vector>
#include<iostream>
const int max = 8;
bool checkvalid(int* array, int row1, int col)
{
for(int j=0; j<row1; j++)
{
if( array[j] == col) //not in the same colon
return false;
if( ((row1- j) == ( array[j]-col)) || ((row1- j) == ( -array[j]+col)) ) // not in the same diagonal
return false;
}
return true;
}
void placequeen(int row, int* array, std::vector<int*> &myvector)
{
if( row == max)
{
myvector.push_back(array); // if I print here , result is correct
/* for(int i=0; i<8; i++)
std::cout << array[i] ;
std::cout << std::endl;*/
}
else
{
for(int i=0 ; i<max; i++)
{
if(checkvalid(array, row, i))
{
array[row] = i;
placequeen(row+1, array,myvector);
}
}
}
}
int main()
{
std::vector<int*> a;
int* array = new int[8];
placequeen(0, array, a);
for(std::vector<int*>::iterator it=a.begin(); it!=a.end(); it++)
{
for(int i=0 ; i<8; i++)
{
std::cout << (*it)[i] ; }
std::cout << std::endl;
}
}
这是破解代码访谈的n女王问题。它始终打印相同的结果“75364424”。但是如果我在if(row == max)里面打印结果是正确的(我在那里切换代码),为什么以及如何改变?感谢
答案 0 :(得分:-2)
从@ Jarod42的评论中,我知道我必须将向量中的指针更改为 的std ::阵列。在我以前的代码中,我一次又一次地将相同的指针存储在向量中。 #包括 的#include
const int max = 8;
bool checkvalid(std::array<int, 8> array, int row1, int col) // change array* to std::array<int, 8> array
{
for(int j=0; j<row1; j++)
{
if( array[j] == col) //not in the same colon
return false;
if( ((row1- j) == ( array[j]-col)) || ((row1- j) == ( -array[j]+col)) ) // not in the same diagonal
return false;
}
return true;
}
void placequeen(int row, std::array<int, 8> array, std::vector<std::array<int, 8>> &myvector) // change array* to std::array<int, 8> array
{
if( row == max)
{
myvector.push_back(array); // if I print here , result is correct
}
else
{
for(int i=0 ; i<max; i++)
{
if(checkvalid(array, row, i))
{
array[row] = i;
placequeen(row+1, array,myvector);
}
}
}
}
int main()
{
std::vector<std::array<int, 8>> a;
std::array<int, 8> array;
placequeen(0, array, a);
for(std::vector<std::array<int, 8>>::iterator it=a.begin(); it!=a.end(); it++)
{
for(int i=0 ; i<8; i++)
{
std::cout << (*it)[i] ; }
std::cout << std::endl;
}
}