题目要求的输出格式为输出前3解即可,然后输出解的总数,且前三行输出格式为以行为下标,列为值
m3数组可能为负数所以加n来保证数组不越界
#include<iostream>
using namespace std;
int n, ans[15], m1[30], m2[30], m3[30], mark;
void setvalue(int x, int y, int k)
{
ans[x] = y;//题目要求表示方式
m1[y] = k;
m2[x + y] = k;
m3[x - y + n] = k;
}
void dfs(int step)//step代表当前搜索到第几行
{
if (step > n)
{
mark++;//解的总数
if (mark <= 3)//只输出前三行
{
for (int i = 1; i <= n; ++i) cout << ans[i] << " ";
cout << endl;
}
return;
}
for (int j = 1; j <= n; ++j)
{
//加n是因为可能为负数
if (m1[j] || m2[step + j] || m3[step - j + n]) continue;
setvalue(step, j, 1);//更新状态位
dfs(step + 1);
setvalue(step, j, 0);//回溯
}
}
int main()
{
cin >> n;
dfs(1);
cout << mark;
return 0;
}