按照 I 中的做法只是把返回结果变了一下,提交出现超时,这有点意思。想了想,也不能不递归呀,于是做了一些优化,既是在每次求下一值之前(即进行递归之前)先判断当前的布局是否合理,这样就能大大减少递归的次数,以十次为例,这样的提升一下子就能感觉到。
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,int &ret)//
{
if (i==n)//if (i==n&&isvalid(arr,n))
{
ret++;
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);
}
}
}
}
int totalNQueens(int n) {
int ret=0;
int *arr = new int[n];
onesolu(arr,n,0,ret);// onesolu(arr,n,0);
delete[] arr;
return ret;
}
这提醒了我,第一题没提交过去是不是也是超时,于是改后提交又提交了一次,果真,这次通了。好一个回马枪,呵呵