这是做题前写的简单的思路
1、输入n,皇后个数
2、从0开始,放皇后放皇后条件{ 1、横向row==0
2、纵向hign==0
3、斜线line1==0
4、斜线line2==0
5、皇后个数未超界
}
放完皇后,row、high、line1、line2,都等于1
最后一个皇后成立,输出记录数组
了解了主要思路以后,解题就轻松多了。
无须多言,看我的注释就好
#include <stdio.h>
int N; //皇后个数
int record[101][101]={0}; //记录每个位置是否有皇后
int row[101]={0}; //记录某一行是否有皇后
int high[101]={0}; //记录每一列
int line1[202]={0}; //‘/’的斜线
int line2[202]={0}; //‘\’的斜线
int tms=0; //可能的情况数
void print(){
int i,j;
for (i=0;i<N;i++)
{
for (j=0;j<N;j++)
{
printf("%d ",record[i][j]);
}
printf("\n");
}
printf("\n");
}
int judge(int i,int j){
if (row[i]||high[j]||line1[i+j]||line2[i+N-1-j]) //有一个标记为1,这个点就不能放
return 0;
else return 1;
}
void unmark(int i,int j){
row[i]=0;
high[j]=0;
line1[i+j]=0;
line2[i+N-1-j]=0;
record[i][j]=0;
}
void mark(int i,int j){
row[i]=1;
high[j]=1;
line1[i+j]=1; //注意观察就能发现,每个斜线都能有它唯一的编号
line2[i+N-1-j]=1; //想不到的话就画图观察一下,你能观察到的
record[i][j]=1;
}
void add(int n){
int i;
// int result;
if (n==N-1) //放置最后一行时,有一个可放置点,即输出一种情况
{
for (i=0;i<N;i++)
{
if (judge(n,i)) //判断(n,i)这个点是否合法
{
mark(n,i); //若合法,则对该点进行标记
print(); //输出当前的皇后排布
tms++;
unmark(n,i); //取消对该点的标记,因为所有的标记数组都是全局变量
}
}
}
else
{
for(i=0;i<N;i++){ //对第n行的每个点进行判断
if(judge(n,i)) {
mark(n,i);
add(n+1); //第n行放置一个皇后以后,在第n+1行放置皇后
unmark(n,i);
}
}
}
}
int main(){
scanf("%d",&N); //输入皇后个数
add(0); //从第0行开始放置
if (tms==0) //输出有多少种情况
{
printf("Sorry,%d Empress can not be peaceful\n",N);
}
else printf("There's %d ways to put them~\n",tms);
return 0;
}