70,037
社区成员
发帖
与我相关
我的任务
分享#include<stdio.h>
#define MaxSize 2000
void InitBoard(int *a,int n)
{
int i;
for(i=0;i<n;i++)
{
a[i]=0;//初始化棋盘,将每行置于第一列
}
}
int conflict(int *a,int n)
{
int i;
int flag = 0;
for(i=0;i<n;i++) //查看第n
{
if((a[i]==a[n])||(a[i]-a[n]==i-n)||(a[i]-a[n]==n-i))//不在一列 不在同一对角线
{
flag = 1;
}
}
return flag;
}
int Queen(int n)
{
int count = 0;
int a[MaxSize];
InitBoard(a,n);
int i=0;
while(1)
{
if(a[i]<n)//该行未超出棋盘范围
{
if(conflict(a,i))//有冲突
{
a[i]++;//查看下一个节点
continue;
}
if(i>n-1)//到达最后一行,查看最后一行成功遍历的个数
{
count++;//成功数
a[n-1]++;//查看最后一行其他点是否可行
continue;
}
i++;//没有冲突 进入下一行
continue;
}
else //该行已经超出范围
{
a[i] = 0;//先将这一行复位
i--;
if(i<0)//已经不能退了 说明遍历结束
{
return count;
}
a[i]++;
continue;
}
}
}
int main()
{
int n;
scanf("%d",&n);
int resault = Queen(n);
printf("%d",resault);
return 0;
}
#include <stdio.h>
int left[15]={0},right[15]={0},col[8]={0};
int q[8],top=-1;
int cnt=0;
void print() //按顺序输出
{
int i,j;
printf("这是第%d个解:\n",++cnt);
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(q[i]==j)
printf("Q ");
else printf("X ");
}
printf("\n");
}
}
void EightQueue ()
{
int i=0,j=0;
top=-1;
while(i<8) //从第一层开始
{
while(j<8) //从第一列开始
{
if(col[j]==0&&left[i+j]==0&&right[i+7-j]==0) //如果满足条件,则跳出循环
break;
j++;
}
if(j<8) //如果跳出循环后j是在0~7,则放皇后
{
q[++top]=j;
left[i+j]=1;
right[i+7-j]=1;
col[j]=1;
if(i<7) //如果放的层数在0~7,则说明还没放完
{
i++;
j=0;
}
else //8层全部放满了,输出棋盘
{
print();
printf("\n");
if(top!=-1) //如果这个时候栈非空,则回到栈顶皇后,并将其抹去
{
i=top;
j=q[top--];
left[i+j]=col[j]=right[i+7-j]=0;
j++;
}
}
}
else //如果在0~7中没找到合适的位置放皇后,则回到栈顶皇后,并将其抹去(栈不为空)
{
if(top!=-1)
{
i=top;
j=q[top--];
left[i+j]=col[j]=right[i+7-j]=0;
j++;
}
}
if(i==-1) //当第一层的位置都已经使用过,则会使i跳到下面一层,即皇后的放法已经全部找出
break;
}
}
int main (void)
{
EightQueue();
return 0;
}