国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

八皇后問題(遞歸實現)

2019-11-08 01:41:09
字體:
來源:轉載
供稿:網友

八皇后問題,是一個古老而著名的問題,是回溯的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾于1848年提出:在8X8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處于同一行、同一列或同一斜線上,問有多少種擺法。 

這里用遞歸算法實現,因為遞歸在某個層面上就實現了回溯,再算法中,構造8x8的數組,初始全部為0,一行一行的進行判斷,當某一行沒有危險,遞歸調用該函數。下面給出代碼。

#include<stdio.h>int count;int noDanger(int row,int j,int (*chess)[8]){	int i,k;	int flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;	for(i=0;i<8;i++)	{		if(*(*(chess+i)+j))		{			flag1=1;			break;		}	}	for(i=row,k=j;i>=0&&k>=0;i--,k--)	{		if(*(*(chess+i)+k))		{			flag2=1;			break;		}	}		for(i=row,k=j;i<8&&k<8;i++,k++)	{		if(*(*(chess+i)+k))		{			flag3=1;			break;		}	}	for(i=row,k=j;i>=0&&k<8;i--,k++)	{		if(*(*(chess+i)+k))		{			flag4=1;			break;		}	}		for(i=row,k=j;i<8&&k>=0;i++,k--)	{		if(*(*(chess+i)+k))		{			flag5=1;			break;		}	}	if(flag1||flag2||flag3||flag4||flag5)		return 0;	else 		return 1;}void EightQueen(int row,int n,int (*chess)[8]){	int i,j,chess2[8][8];	for(i=0;i<8;i++)		for(j=0;j<8;j++)			chess2[i][j]=chess[i][j];		if(row==8)       //因為row從0開始,等于8的時候已經是第九次了,說明前8次已經沒有危險的排好了		{			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后面幾行代碼		else		{			for(j=0;j<n;j++)			{				if(noDanger(row,j,chess2)!=0)				{					for(i=0;i<8;i++)					{					  *(*(chess2+row)+i)=0;						}					  *(*(chess2+row)+j)=1;					  EightQueen(row+1,n,chess2);  //由于遞歸算法的性質,一層遞歸完成后會回到上一層遞歸處				}			}		}} int main(){	int i,j,chess[8][8];	for(i=0;i<8;i++)		for(j=0;j<8;j++)			chess[i][j]=0;		EightQueen(0,8,chess);		return 0;}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 广安市| 台中市| 岫岩| 霸州市| 丁青县| 海丰县| 筠连县| 冷水江市| 庄浪县| 苏州市| 灵璧县| 通榆县| 仙桃市| 柳林县| 积石山| 天全县| 芷江| 霞浦县| 个旧市| 彩票| 托克托县| 安岳县| 全南县| 阿城市| 奉化市| 永吉县| 鄢陵县| 大石桥市| 绍兴县| 久治县| 舟曲县| 西充县| 金湖县| 罗平县| 龙泉市| 泉州市| 手机| 安乡县| 寿光市| 淄博市| 佳木斯市|