如果你接触过国际象棋,你就会知道象棋里面的皇后可以横着走,竖着走,斜着走。
如果你接触过acm,你就会明白,这是一个很经典很经典的皇后互不攻击问题。
如果你如果你既接触过国际象棋,有接触过acm,那就很容易看懂这篇日志。
题目:由n*n个方块排成n行n列的正方形称为“n元棋盘”。如果两个皇后位于n元棋盘上的同一行或同一列或同一对角线上,则称它们为互相攻击。要求输出使n无棋盘上的n个皇后互不攻击的所有布局。
我们知道,每一行的皇后列数都不相同,从上往下看,一定是一个n的全排列。于是,我们构造n的全排列(经典的递归算法),并验算它们是否在同一斜行,如果两两都不在同一斜行,则就可以输出了。
这不是acm题目,有动态分配数组的要求。我们在主函数里面动态分配,在函数体里面设置成静态局部变量,就可以了。
如果你接触过acm,你就会明白,这是一个很经典很经典的皇后互不攻击问题。
如果你如果你既接触过国际象棋,有接触过acm,那就很容易看懂这篇日志。
题目:由n*n个方块排成n行n列的正方形称为“n元棋盘”。如果两个皇后位于n元棋盘上的同一行或同一列或同一对角线上,则称它们为互相攻击。要求输出使n无棋盘上的n个皇后互不攻击的所有布局。
我们知道,每一行的皇后列数都不相同,从上往下看,一定是一个n的全排列。于是,我们构造n的全排列(经典的递归算法),并验算它们是否在同一斜行,如果两两都不在同一斜行,则就可以输出了。
这不是acm题目,有动态分配数组的要求。我们在主函数里面动态分配,在函数体里面设置成静态局部变量,就可以了。
话不多说,附上代码:(代码:大河时代)
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
int printed;
void draw(int* a,int k)
{
int i,j;
for(i=0;i<k;i++)
{
printf("\t");
for(j=0;j<k;j++)
if(a[i]-1==j) printf("Q "); else printf("- ");
printf("\n");
}
printf("\n");
}
void Settle(int *a,int iStep,int k)
{
int i,j,l,flag=1;
for(i=0;i<iStep-1;i++)
if(a[iStep-1]==a[i]) return;
if(iStep==k)
{
for(j=0;j<k;j++)
for(l=0;l<k&&l!=j;l++)
if(fabs(j-l)==fabs(a[j]-a[l])) flag=0;
if(flag)
{
for(i=0;i<k;i++)
printf("(%d,%d) ",i+1,a[i]);
printf("\n");
draw(a,k);
printed++;
}
flag=1;
}
for(i=1;i<=k;i++)
{
a[iStep]=i;
Settle(a,iStep+1,k);
}
}
void main()
{
int* a;
int k;
printf("Enter the size of the square:");
scanf("%d",&k);
a=(int*)calloc(k,sizeof(int));
system("cls");
Settle(a,0,k);
if(! printed) printf("No answers accepted!\n");
else printf("%d states available!\n",printed);
}
1647

被折叠的 条评论
为什么被折叠?



