/*八皇后问题,在一个8*8的数组中,放置8个国际象棋中的皇后棋子,问有多少种摆法 */
/*可以让皇后不在其他七个棋子的攻击范围之内 */
/*皇后的攻击范围是,以其所在点为中心的一个米字型,也就是说该棋子的 */
/*判断放在该位置的皇后是否在其他皇后的攻击范围中, */
/*如果该行的所有列都无法放置皇后,向前回溯一步,将前一行皇后放置在下一个可能的位置 */
#include<stdio.h>
#define LINE 8
#define COL 8
#define QUEEN 8
#define TRUE 1
#define FALSE 0
void eight_queen(char (*)[],int,int);
void show_array(const char (*)[]);
int guess_queen(char (*)[],int,int);
int main(void)
{
int count=0;
static char array[LINE][COL]={0}; /*据说静态数组能够提高效率,在一瞬间就初始化完毕 */
while(count<LINE)
{
eight_queen(array,QUEEN,count);
show_array(array);
count++;
puts("Very good you win!(press any key to continue!)");
getchar();
}
printf("QUEEN is :%d/n",count);
puts("Bye");
return 0;
}
void eight_queen(char (*array)[QUEEN],int q,int n)
{
int i,j,c=0;
int num=0,t=0;
static char count[LINE]={0};
for(i=n;i<LINE;i+=1)
{
num=i;
for(t=FALSE,c=count[i],j=0;j<COL;j+=1)
{
t=guess_queen(array,i,j); /*不仅要判断该位置是否在其他皇后攻击范围内,还要注意只求,
该位置的低行标位置皇后,而忽略高行标位置 */
if(c!=0&&t==TRUE) /* 如果经过上面的判断,该位置可以放置皇后的同时,
代表该数组位置是否后续行放置皇后失败返回的判断量,
为0时可以放置皇后并计数*/
{
c--;
t=FALSE;
continue; /*如果c不为0时,要跳到下一个可以放置皇后的位置 */
}
else if(t==TRUE) /*经过判断后,该位置为真的同时,放置位置次数为0时,
在该位置上放置皇后,并计数 */
{
array[i][j]='Q';
count[i]+=1; /*记录跳过可放置皇后位置的次数,为后续返回时做准备 */
num++;
break;
}
}
if(t==FALSE) /*如果没有成功放置皇后,要返回前一行更换皇后放置的位置 */
{
int z=i;
i-=2;
while(z<LINE)
count[z++]=0;
}
}
}
int guess_queen(char (*array)[COL],int i,int j)/*判断该位置是否与其他皇后有冲突 */
{
int k,g;
if(j==0)
for(g=0;g<COL;g++) /*清空该行在回溯时清空皇后 */
array[i][g]=0;
g=i;
while(--g>=0) /*元素正下方是否有皇后能够攻击该位置的皇后 */
if(array[g][j]=='Q')
return FALSE;
g=i;
k=j;
while(--g>=0&&--k>=0) /*王后左下对角线上是否有皇后能够攻击该位置 */
if(array[g][k]=='Q')
return FALSE;
g=i;
k=j;
while(--g>=0&&++k<COL) /*王后右下对角线上是否有皇后能够攻击该位置 */
if(array[g][k]=='Q')
return FALSE;
return TRUE;
}
void show_array(const char (*array)[QUEEN]) /*输出数组中皇后的摆放情况 */
{
int i,j;
for(i=0;i<LINE;i++)
{
for(j=0;j<COL;j++)
{
if(array[i][j]=='Q')
{
printf("%3c",array[i][j]);
continue;
}
printf("%3d",array[i][j]);
}
putchar('/n');
}
}/*终于弄出了一个雏形,现在能把 皇后在第一行八个位置上的 问题解决掉了,之后要解决的是,所有解法的问题*/
还没有学习算法,而且函数递归用的不好,所以使用的是循环控制;同时由于怕麻烦也没有使用指针法掉用数组,效率低,以后改进