这道题用的其实是深搜的思想(或者说回溯法)。
/**
* 回溯??
* 模拟,搜索?
*
* 需要数组记录
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
bool map[15][15];
int num;
int isput(int x, int y, int n)
{
int i, j;
for(i = x, j = y; i <= n && j <= n && i >= 1 && j >= 1; i++)
{
if(map[i][j])
return false;
}
for(i = x, j = y; i <= n && j <= n && i >= 1 && j >= 1; i--)
{
if(map[i][j])
return false;
}
for(i = x, j = y; i <= n && j <= n && i >= 1 && j >= 1; j++)
{
if(map[i][j])
return false;
}
for(i = x, j = y; i <= n && j <= n && i >= 1 && j >= 1; j--)
{
if(map[i][j])
return false;
}
for(i = x, j = y; i <= n && j <= n && i >= 1 && j >= 1; i++,j++)
{
if(map[i][j])
return false;
}
for(i = x, j = y; i <= n && j <= n && i >= 1 && j >= 1; i--,j--)
{
if(map[i][j])
return false;
}
for(i = x, j = y; i <= n && j <= n && i >= 1 && j >= 1; i++,j--)
{
if(map[i][j])
return false;
}
for(i = x, j = y; i <= n && j <= n && i >= 1 && j >= 1; i--,j++)
{
if(map[i][j])
return false;
}
return true;
}
void dfs(int y, int n)
{
if(y > n)
{
num++;
return;
}
for(int x = 1; x <= n; x++)
{
if(isput(x, y, n))
{
map[x][y] = 1;
dfs(y + 1, n);
map[x][y] = 0;
}
}
}
int main()
{
int data[15];
int n;
for(int i = 1; i <= 10; i++)
{
num = 0;
memset(map, 0, sizeof(map));
dfs(1, i);
data[i] = num;
}
while(scanf("%d", &n) == 1 && n)
{
printf("%d\n", data[n]);
}
return 0;
}