1. 程式人生 > >C語言回溯法遞迴求解八皇后問題

C語言回溯法遞迴求解八皇后問題

Problem E

8皇后問題

時限:1000ms 記憶體限制:10000K 總時限:3000ms

描述:

輸出8皇后問題所有結果。

輸入:

沒有輸入。

輸出:

每個結果第一行是No n:的形式,n表示輸出的是第幾個結果;下面8行,每行8個字元,‘A’表示皇后,‘.’表示空格。不同的結果中,先輸出第一個皇后位置靠前的結果;第一個皇后位置相同,先輸出第二個皇后位置靠前的結果;依次類推。

輸入樣例:

輸出樣例:

輸出的前幾行: No 1: A....... ....A... .......A .....A.. ..A..... ......A. .A...... ...A.... No 2: A....... .....A.. .......A ..A..... ......A. ...A.... .A......

....A...

#include<stdio.h> #include<math.h> int n=8,a[8],counter=1; void search(int m); int  canplace(int row,int col); void output(); int main() { search(0); return 0; } void search(int m)//回溯法遞迴求解每一行的情況 { if(m==n)output(); else  { for(int i=0;i<n;i++) { if(canplace(m,i))//判斷在該處是否能放置皇后 { a[m]=i;//用m表示行數,i表示列數,可以避免二維陣列判斷時帶來的麻煩 search(m+1);//求解下一行的情況    } } } } int canplace(int row ,int col) { int i,j,flag; flag=1; for(i=0;i<row;i++) { if(a[i]==col||fabs(row-i)==fabs(col-a[i]))//判斷該列是否有皇后及於此位置在同一斜線上的位置處是否有皇后 { flag=0;//若存在,則此處不能放置皇后 break;    } } return flag; } void output() { printf("No %d:\n",counter); counter++;//輸出每個滿足條件的結果序數 for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(j==a[i])printf("A"); else printf("."); } printf("\n");  } }

相關推薦

C語言回溯求解皇后問題

Problem E 8皇后問題 時限:1000ms 記憶體限制:10000K 總時限:3000ms 描述: 輸出8皇后問題所有結果。 輸入: 沒有輸入。 輸出: 每個結果第一行是No n:的形式,n表示輸出的是第幾個結果;下面8行,每行8個字元,‘A’表示皇后,‘.’

求解皇后問題

問題描述會下國際象棋的人都很清楚:皇后可以在橫、豎、斜線上不限步數地吃掉其他棋子。如何將 8 個皇后放在棋盤上(有 8 * 8 個方格),使它們誰也不能被吃掉!這就是著名的八皇后問題。 對於某個滿足要求的 8 皇后的擺放方法,定義一個皇后串 a 與之對應, a=b1b2..

c 語言 用函式來實現求 k 的 n 次方

       如果求取k的n次方,既可以用普通的方法實現,也可以用函式的遞迴來實現。        函式的遞迴即是自己呼叫自己的函式應用形式,即在main函式下定義一個函式,然後在這個函式內自己為了實現某個目的,函式

C語言探究函式的巧妙之處(以斐波那契數列為例)

對於許多C語言的初學者來說,函式是一個比較重要的版塊.函式的使用不僅在學習程式設計的時期可以方便我們解決一些問題.它在未來的工作中也是程式設計師們經常運用的東西.而函式的遞迴是函式這一版塊比較難懂的東西.因此小編以輸出斐波那契數列的第N項為例,來探討函式的遞迴的應用給我們的程式碼帶來的方便.

楊輝三角的C語言實現(與非

本文用C語言程式碼實現楊輝三角 遞迴演算法依據於f(m,n)=f(m-1,n)+f(m-1,n-1) 其中(m,n)為楊輝三角第m行第n個元素 演算法程式碼如下:   #include <stdio.h> //遞迴函式 int func(int m,in

n皇后問題(回溯-和迴圈

n皇后問題簡單解釋 對於一個n*n的棋盤來說,皇后如果是同行同列或者是在同一斜對角上,就是會相互擊殺。 所以,我們需要找到一個安全的(使得所有皇后之間不相互擊殺)安排方式。 遞迴版本 #include

C語言基礎篇——函式

一、定義 直接或間接呼叫函式本身,則該函式稱為遞迴函式 二、兩個要點 (1)趨近於一個臨界值 (2)呼叫自己本身 三、舉例 (1)求n! int Fun(int n) { int tmp=n; if(n==1)//臨界值 { tmp=n; return

C語言_函式舉例

1.遞迴和非遞迴分別實現求第n個斐波那契數。 //求第 n 個斐波那契數 #include <stdio.h> #include <stdlib.h> int Fib1(int n) { if (n == 1 || n == 2) { re

演算法精解:C語言描述(

演算法精解真的是一本不錯的書,雖然我真的不是很喜歡看書,但是不知不覺間就看完了6單元。裡面對每一模組的具體程式碼實現和分析,寫的非常透徹。初入CSDN,也是決定要好好學習一波,自此開始好好記錄自己學習的一步步腳印和一次次的失敗。不知道能堅持多久,但希望能久一些。 1.遞迴的認知。  

c語言練習之

1.遞迴和非遞迴分別實現求第n個斐波那契數。 遞迴實現 #include <stdio.h> #include <stdlib.h> int fblq(int n){ if (n == 1 || n == 2){ return 1; } return f

C語言:用實現將輸入的整數按逆序輸出。如輸入12345,則輸出54321。

這個程式是我對建構函式有個更深的認識。 首先建構函式要先從頭至尾走一邊才會輸出,無論輸出語句加的位置(迴圈內,條件語句內...除外)。 然後建構函式遞迴可以把問題簡單化,本題如果按常規思路,應該是做個迴圈,把各個數首尾交換。但是用呼叫使得其可以一次輸出一位數,而並不是輸出一個

回溯+ 列舉走樓梯的所有解決方案

/* 華科機試練手 * N階樓梯上樓問題:一次可以走兩階或一階,請把所有行走方式打印出來。 * 測試資料: 5 輸出結果 一共有8種走法 * 測試資料: 15 輸出結果 一共有987種走法

求{1,2,3}的子集————回溯(與非)

求ar[]={1,2,3}的子集序列,小夥伴們可以先自己嘗試解一下~~ #include<iostream> using namespace std; //用回溯法搜尋子集樹 void fun(int *ar,int *br,int n)//非遞迴

C語言構造並遍歷二叉樹

#include<stdio.h> #include<malloc.h> #define FALSE 1 #define ERROR 0 #define OK 1 #define ON 0 typedef struct BiTNode {

C語言中自我的幾個例子

遞迴 遞迴就是一個函式在它的函式體內呼叫它自身。執行遞迴函式將反覆呼叫其自身,每呼叫一次就進入新的一層。 遞迴函式必須有結束條件。 遞迴分為回推和遞推兩個階段,當一直回推,直到遇到牆後返回,這個牆就是結束條件。 所以遞迴要有兩個要素,回推牆與遞推關係 例

資料結構(C語言版)-學習筆記

遞迴,介紹瞭解決某一類問題的思維方式。在一個函式定義中出現了對自己本身的呼叫,稱為直接遞迴。一個函式p的定義中包含了對函式q的呼叫,而q的實現過程中又呼叫了p,即函式呼叫形成了一個環狀呼叫鏈,這種方式稱之為間接遞迴。 一個最簡單遞迴程式設計的例項。 例子1 編寫一個遞迴函式

C語言】用函式是實現函式功能的幾個例子

1.問題描述:寫一個遞迴函式DigitSum(n),輸入一個非負整數,返回組成它的數字之和。例如,呼叫DigitSum(1729),則應該返回1+7+2+9,它的和是19。 思路:這個題比較類似於求拆分整數,一個一個輸出。這個題多得一步是在拆分後,將這些數字加

Day6.17 C語言簡單函式呼叫之求x的y次方

#include<stdio.h> int xy(int x,int y){int jieg;if(y==1){jieg=x;}else{jieg=xy(x,y-1)*x; }return

藍橋杯C語言培訓2 原理與構造技巧 例題2 出棧順序

X星球特別講究秩序,所有道路都是單行線。一個甲殼蟲車隊,共16輛車,按照編號先後發車,夾在其它車流中,緩緩前行。路邊有個死衚衕,只能容一輛車通過,是臨時的檢查站,如圖所示。X星球太死板,要求每輛路過的車必須進入檢查站,也可能不檢查就放行,也可能仔細檢查。如果車輛進入檢查站和離

C語言程式設計之求階乘

題目: 利用遞迴方法實現一個函式,該函式能夠實現n的階乘,即 n! = n*(n-1)*…*3*2*1; #include <stdio.h> int factorial(int n) { if(n == 1) //結束遞迴判斷條件 { retur