N Queen(代码、分析、汇编)
生活随笔
收集整理的這篇文章主要介紹了
N Queen(代码、分析、汇编)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
目錄:
- 代碼:
- 分析:
- 匯編:
代碼:
main.c
#include <stdio.h>/* 程序描述:輸出N*N中符合左右對(duì)角線與上下左右方向都沒被使用的位置在每一行的所有情況使用檢測(cè)左上角,正上角,右上角 三個(gè)方向有沒有被使用來判斷該行該位置是否可以使用當(dāng)檢測(cè)行大于N時(shí),表示完成一種情況,按下回車鍵。從大于N行的這次find函數(shù)調(diào)用出棧。返回調(diào)用(使用大于N行的參數(shù)調(diào)用了find函數(shù)的)處。就是N行調(diào)用find函數(shù)的地方執(zhí)行將N行原本選用好的位置重置,再找下一個(gè)。如果找到就重復(fù)上面大于N行的find函數(shù)調(diào)用如果沒找到,將調(diào)用N行的find函數(shù)出棧,返回到N-1行調(diào)用find函數(shù)的地方,在N-1行查找找到就再調(diào)用回N行,找不到就再出棧,返回上一行也就是調(diào)用處。總結(jié):在本行找到就調(diào)用到下一行查找,本行找不到就返回到上一行查找,找到就再返回到下一行,找不到就再返回到上一行,實(shí)現(xiàn)將所有情況輸出*/ #define N 5typedef struct _tag_Pos {int ios;int jos; } Pos;static char board[N+2][N+2];//定義二維數(shù)組,加2用于上下左右四邊 static Pos pos[] = { {-1, -1}, {-1, 0}, {-1, 1} }; //定義用于向左上角,正上角,右上角的位置遞增的數(shù)組 static int count = 0;void init()//初始化數(shù)組函數(shù) {int i = 0;int j = 0;for(i=0; i<N+2; i++)//將二維數(shù)組的四邊賦上'#'{board[0][i] = '#'; //上board[N+1][i] = '#'; //下board[i][0] = '#'; //左board[i][N+1] = '#'; //右}for(i=1; i<=N; i++)//將內(nèi)部內(nèi)容賦上空格{for(j=1; j<=N; j++){board[i][j] = ' ';}} }void display()//將整個(gè)二維數(shù)組輸出顯示函數(shù) {int i = 0;int j = 1;for(i=0; i<N+2; i++){for(j=0; j<N+2; j++){printf("%c", board[i][j]);}printf("\n");} }int check(int i, int j)//檢測(cè)該位置是否符合要求 {int ret = 1;int p = 0;for(p=0; p<3; p++){int ni = i;int nj = j;while( ret && (board[ni][nj] != '#') )//判斷這個(gè)位置不是在四邊{ni = ni + pos[p].ios;nj = nj + pos[p].jos;//如果該位置的左上角方向有被使用了,不再進(jìn)行的正上角與右上角的檢測(cè)//因?yàn)閞et 為0了,如果第一個(gè)左上角位置沒有被使用。將一直位移比較//直至遇到'#'四邊ret = ret && (board[ni][nj] != '*');//判斷這個(gè)位置沒被使用}}return ret; }void find(int i)//查找位置函數(shù)(主要函數(shù)) {int j = 0;if( i > N ){count++;printf("Solution: %d\n", count);display();getchar();}else{for(j=1; j<=N; j++){if( check(i, j) ){board[i][j] = '*';find(i+1);//函數(shù)執(zhí)行完出棧時(shí)將這個(gè)位置重置,相當(dāng)在這一行重新找下一個(gè)符合要求的位置//在這一行找不到時(shí),調(diào)用的這行的函數(shù)出棧。返回到上一行調(diào)用的這個(gè)位置//又將上一行的原來的使用的位置重置,找下一個(gè)符合要求的位置,如果找不到//就再返回上一行重設(shè)尋找,如果找到,就再調(diào)用自身從新到下一行找,//依此類推board[i][j] = ' ';}}} }int main() {init();find(1);return 0; }分析:
匯編:
總結(jié)
以上是生活随笔為你收集整理的N Queen(代码、分析、汇编)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 花果山门票多少钱啊?
- 下一篇: 树存储结构(代码、分析、汇编)