题目
分析
基本dfs,不过注意到答案的格式是按列枚举,在dfs时按列枚举即可
代码
#include <iostream>
using namespace std;
const int N = 20, M = 40;
int g[N][N];
bool row[N], dg[M], udg[M];
int cnt = 0;
void dfs(int u) //u代表列
{
if(u == 8)
{
printf("No. %d\n", ++ cnt);
for(int i = 0; i < 8; i ++ )
{
for(int j = 0; j < 8; j ++ )
cout << g[i][j] << ' ';
cout << endl;
}
}
//枚举当前列的所有行
for(int i = 0; i < 8; i ++ )
{
if(g[i][u] == 0 && !row[i] && !dg[u + i] && !udg[u - i + 10])
{
g[i][u] = 1;
row[i] = dg[u + i] = udg[u - i + 10] = true;
dfs(u + 1); //递归到下一列
row[i] = dg[u + i] = udg[u - i + 10] = false;
g[i][u] = 0;
}
}
}
int main()
{
for(int i = 0; i < 8; i ++ )
for(int j = 0; j < 8; j ++ )
g[i][j] = 0;
dfs(0);
}