常见的八皇后问题采用非递归实现代码。
其实加个栈保存能放在的是哪一列就行了。
#include <stdio.h>
const int maxn = 35;
int ans, n, stack[maxn];
int is_ok ( int k )
{
for ( int i = 1; i < k; i ++ ) //判断是否和前面的行列重复
if ( k-stack[k] == i-stack[i] || stack[i] == stack[k] || stack[i]+i == stack[k]+k )
return 0;
return 1;
}
void dfs_stack ( )
{
stack[1] = 0;
for ( int top = 1; top > 0; )
{
int ok = 0;
stack[top] ++; //这里行从1开始,0也一样
while ( stack[top] <= n && ! is_ok ( top ) )
//找到成立的列
stack[top] ++;
if ( stack[top] <= n )
{
if ( top == n ) //到第n行就表示已找到
{
ans ++;
top --;
}
else
{
top ++;
stack[top] = 0;
}
}
else //超过就要出栈
top --;
}
}
int main ( )
{
scanf ( "%d", &n );
dfs_stack ( );
printf ( "%d", ans );
return 0;
}