?? 八皇后問題的遞歸算法.txt
字號:
八皇后問題的遞歸求解
#include <stdio.h>
#include <stdlib.h>
#define N 8 /* 棋盤邊長 */
#define XXN 15 /* 正(反)對角線個數(shù) */
#define TRUE 1
#define FALSE 0
int map[N][N];/* 棋盤 */
int col[N]; /* 列 */
int XX[XXN]; /* 正對角線 */
int YY[XXN]; /* 反對角線 */
FILE* fp;
int num=0; /* 解的個數(shù) */
/**
顯示一個解
*/
void showMap()
{
int i,j;
fprintf(fp,"\n--------------------------\n");
for(i=0;i<N;i++){
for(j=0;j<N;j++)
fprintf(fp,"%-3d",map[i][j]);
fprintf(fp,"\n");
}
}
/**
遞歸求解函數(shù)
*/
int try(int y)
{
int i,j;
int success=FALSE;
if( y==N){ /* 求出一個解*/
showMap();
num++;
return TRUE;
}
for(i=0;i<N;i++){
if(XX[N-y+i]==0 && YY[i+y]==0 && col[i]==0) /* 保證布局要求; 對角線,列,沒有重復(fù)放置棋子 */
{
XX[N-y+i]=YY[i+y]=col[i]=map[y][i]=1;
if(try(y+1)) success=TRUE; /* 放下一個皇后 */
XX[N-y+i]=YY[i+y]=col[i]=map[y][i]=0;
}
}
return success;
}
main()
{
int i,j,result;
fp=fopen("queen8.txt","w+");
for(i=0;i<N;i++)
for(j=0;j<N;j++)
map[i][j]=0;
for(i=0;i<XXN;i++) XX[i]=YY[i]=0;
fprintf(fp,"\n start..............");
if(!try(0))printf("\n no resolution!");
fprintf(fp,"\n num=%d",num);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -