Problem Description
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。
该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出的:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
现在在8X8的国际象棋棋盘上被挖了一些洞,这些洞不能放棋子,求八皇后问题的摆放方案,并将摆放方案看做是一个8位的整数,输出值最小的一种方案。
Input Description
棋盘用.表示正常格子,用#表示被挖掉的洞,一共8行8列。
Output Description
输出从上到下的每一行的皇后所在列号(1-8)。
注意:只输出列号,第i个数字表示第i行的皇后在第几列。详见样例输出。
Sample Input
........ ........ ..##.... ####.... ........ ........ ........ ........
Sample Output
15863724
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include<string.h>
const int N = 9;
int q[9];
int count;
char a[9][9];
int b[9][9];
bool C[9];
bool L[17];
bool R[17];
void try(int row)
{
if (row > 8)
{
count = 1;
int k;
for (k = 1; k <= 8; k++)
{
for(int i = 1; i < 9; i++)
{
if(q[k] == b[k][i])
{
count = 0;
break;
}
}
}
if(count == 1)
{
for(k = 1; k <= 8; k++)
{
printf("%d", q[k]);
}
exit(0);
}
}
for (int col = 1; col <= 8; col++)
{
if (C[col] && R[row + col] && L[row - col + N])
{
q[row] = col;
C[col] = false;
L[row - col + N] = false;
R[row + col] = false;
try(row + 1);
C[col] = true;
L[row - col + N] = true;
R[row + col] = true;
}
}
}
int main()
{
for(int i = 1; i < 9; i++)
{
gets(a[i]);
}
for(int i = 1; i < 9; i++)
{
for(int j = 1; j < 9; j++)
{
b[i][j] = 0;
}
}
for(int i = 1; i <= 8; i++)
{
for(int j = 0; j <= 8; j++)
{
if(a[i][j] == '#')
{
b[i][j+1] = j+1;
}
}
}
for (int i = 0; i < 9; i++)
C[i] = true;
for (int i = 0; i < 17; i++)
{
L[i] = true;
R[i] = true;
}
try(1);
return 0;
}