#include <stdlib.h>
#define max 8
int queen[max], sum=0; /* max为棋盘最大坐标 */
void show() /* 输出所有皇后的坐标 */
{
int i;
for(i = 0; i < max; i++)
{
printf("(%d,%d) ", i, queen[i]);
}
printf("\n");
sum++;
}
int check(int n) /* 检查当前列能否放置皇后 */
{
int i;
for(i = 0; i < n; i++) /* 检查横排和对角线上是否可以放置皇后 */
{
if(queen[i] == queen[n] || abs(queen[i] - queen[n]) == (n - i))
{
return 1;
}
}
return 0;
}
void put(int n) /* 回溯尝试皇后位置,n为横坐标 */
{
int i;
for(i = 0; i < max; i++)
{
queen[n] = i; /* 将皇后摆到当前循环到的位置 */
if(!check(n))
{
if(n == max - 1)
{
show(); /* 如果全部摆好,则输出所有皇后的坐标 */
}
else
{
put(n + 1); /* 否则继续摆放下一个皇后 */
}
}
}
}
int main()
{
put(0); /* 从横坐标为0开始依次尝试 */
printf("%d", sum);
system("pause");
return 0;
}
2.
#include<stdio.h>
#define N 8
int a[N][N]={0};
int count=0;
bool check(int row,int column);//检查第row,column放置一枚皇后是否可行
void solve(int row);//
void main()
{
solve(1);
}
bool check(int row,int column)
{
int i,j;
if(row==1)return true;
for(i=0;i<row-1;i++)
if(a[i][column-1]==1)return false;//检查第column列是否有皇后,有,则返回0
i=row-2;
j=column-2;
while(i>=0&&j>=0)
{
if(a[i][j]==1)return false;
i--;
j--;
}
i=row-2;
j=column;
while(i>=0&&j<=N-1)
{
if(a[i][j]==1)return false;
i--;
j++;
}
return true;
}
void output()
{
int i,j;
count++;
printf("answer %d:\n",count);
for(i=0;i<8;i++)
{
for(j=0;j<8;j++) printf("%d ",a[i][j]);
printf("\n");
}
}
void solve(int row)
{
int i;
for(i=0;i<N;i++)
{
a[row-1][i]=1;
if(check(row,i+1)==true)
{
if(row==N)output();
else solve(row+1);
}
a[row-1][i]=0;
}
}