小甲鱼的数据结构之八皇后算法

主要写思路…存粹是个人笔记


#include 



int count = 0;

int notDanger( int row, int j, int (*chess)[8] )

{

int i, k, flag1=0, flag2=0, flag3=0, flag4=0, flag5=0;

// 判断列方向

for( i=0; i < 8; i++ )

{

if( *(*(chess+i)+j) != 0 )

{

flag1 = 1;

break;

}

}

// 判断左上方

for( i=row, k=j; i>=0 && k>=0; i--, k-- )

{

if( *(*(chess+i)+k) != 0 )

{

flag2 = 1;

break;

}

}

// 判断右下方

for( i=row, k=j; i<8 && k<8; i++, k++ )

{

if( *(*(chess+i)+k) != 0 )

{

flag3 = 1;

break;

}

}

// 判断右上方

for( i=row, k=j; i>=0 && k<8; i--, k++ )

{

if( *(*(chess+i)+k) != 0 )

{

flag4 = 1;

break;

}

}

// 判断左下方

for( i=row, k=j; i<8 && k>=0; i++, k-- )

{

if( *(*(chess+i)+k) != 0 )

{

flag5 = 1;

break;

}

}

if( flag1 || flag2 || flag3 || flag4 || flag5 )

{

return 0;

}

else

{

return 1;

}

}

// 参数row: 表示起始行

// 参数n: 表示列数

// 参数(*chess)[8]: 表示指向棋盘每一行的指针

void EightQueen( int row, int n, int (*chess)[8] )

{

int chess2[8][8], i, j;

定义一个新的8*8棋盘,i,j变量

for( i=0; i < 8; i++ )

{

for( j=0; j < 8; j++ )

{

chess2[i][j] = chess[i][j];

把传递过来的棋盘赋值到chess2上,相当于复制了一个棋盘指针

}

}

if( 8 == row )   

结束条件,当行数==8时,打印当前是第几种摆法。

并把棋盘的状态打印出来,然后count++

{

printf("第 %d 种\n", count+1);

for( i=0; i < 8; i++ )

{

for( j=0; j < 8; j++ )

{

printf("%d ", *(*(chess2+i)+j));

}

printf("\n");

}

printf("\n");

count++;

}

else

否则,因为行的指向已经规定好,变动列的位置,接着判断每一个位置是否属于安全位置,如果安全,清空该行上的所有位置,即赋值为0,然后在该位置上进行放置棋子,赋值为1。然后使用递归调用自己,(行数+1,列=8,chess2)

这里意思是:从刚开始全为0的棋盘上,每当我放置一个棋子。我就会新建一个新的内存空间,以此往复去检测出所有可能的结果

{

for( j=0; j < n; j++ )

{

if( notDanger( row, j, chess ) ) // 判断是否危险

{

for( i=0; i < 8; i++ )

{

*(*(chess2+row)+i) = 0;

}

*(*(chess2+row)+j) = 1;

EightQueen( row+1, n, chess2 );

}

}

}

}

int main()

{

int chess[8][8], i, j;

定义一个8*8的棋盘,i ,j变量

初始化棋盘,值为0代表为空

for( i=0; i < 8; i++ )

{

for( j=0; j < 8; j++ )

{

chess[i][j] = 0;

}

}

调用八皇后算法(开始所在行,列数,指向棋盘的指针)

EightQueen( 0, 8, chess );

你可能感兴趣的:(小甲鱼的数据结构之八皇后算法)