1. 程式人生 > >【ACM暑假培訓】遞迴演算法3:跳棋的挑戰(八皇后問題)

【ACM暑假培訓】遞迴演算法3:跳棋的挑戰(八皇后問題)

3Checker Challenge

跳棋的挑戰

by Jeru

檢查一個如下的6 x 6的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行,每列,每條對角線(包括兩條主對角線的所有對角線)上都至多有一個棋子。列號上面的佈局可以用序列2 4 6 1 3 5來描述,第i個數字表示在第i行的相應位置有一個棋子,如下:行號 1 2 3 4 5 6
列號 2 4 6 1 3 5

這只是跳棋放置的一個解。請遍一個程式找出所有跳棋放置的解。並把它們以上面的序列方法輸出。解按字典順序排列。請輸出前3個解。最後一行是解的總個數。特別注意: 對於更大的N(棋盤大小N x N)你的程式應當改進得更有效。不要事先計算出所有解然後只輸出,這是作弊。如果你堅持作弊,那麼你登陸

USACO Training的帳號將被無警告刪除PROGRAM NAME: checker

INPUT FORMAT一個數字N (6 <= N <= 13) 表示棋盤是N x N大小的。

SAMPLEINPUT(checker.in)
6

OUTPUT FORMAT前三行為前三個解,每個解的兩個數字之間用一個空格隔開。第四行只有一個數字,表示解的總數。

SAMPLEOUTPUT(checker.out)
2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4

思路:

這其實是典型的八皇后問題,只是變成了N皇后。。。。。。。

對於棋盤上的每個點的座標x,y,

那麼若從行開始遍歷,其x+y,x-y+N,y值都是特有的

#include<stdio.h>
int N,k,sum=0;
int flag1[200]={0};
int flag2[200]={0};
int flag3[20]={0};
int a[20]={0};


void DFS(int i)
{
    if(i==N+1)
	{
	    sum++;
		if(sum<4)
		{
		   for(int k=1;k<=N;k++)
			  printf("%d ",a[k]);
		   printf("\n");
		}
	}
	else{
		for(int j=1;j<=N;j++)
		   if(flag1[i+j]==0&&flag2[i-j+N]==0&&flag3[j]==0)
		   {
		     a[i]=j;
			 flag1[i+j]=1;flag2[i-j+N]=1;flag3[j]=1;
			 DFS(i+1);
             flag1[i+j]=0;flag2[i-j+N]=0;flag3[j]=0;  
		}
	}
}

void main()
{
    scanf("%d",&N);
	DFS(1);
	printf("%d\n",sum);
}

附送上八皇后的程式^-^

八皇后問題,是一個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯1850年提出:在8X8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。

#include<stdio.h>
#define N 8

int col[9],c[17],d[17],find[10];
int m,row=1;


void Find(int row)
{    
	int i;
	if(row==m+1)
	{
	    for(i=1;i<=m;i++)
			printf("%2d",find[i]);
		printf("\n");
	}
		 
	for(i=1;i<=m;i++){
		if(!col[i]&&!c[i-row+8]&&!d[i+row])
		{
		    find[row]=i;
            col[i]=c[i-row+N]=d[i+row]=1;
			Find(row+1);
			col[i]=c[i-row+N]=d[i+row]=0;

		}
	}

}




void main()
{
	int i;
    printf("輸入棋盤邊長\n");
	scanf("%d",&m);
	for(i=1;i<=m;i++)
	   col[i]=c[i]=d[i]=find[i]=0;
	Find(row);
}


相關推薦

ACM暑假培訓演算法3跳棋挑戰皇后問題

3、Checker Challenge 跳棋的挑戰 譯 by Jeru 檢查一個如下的6 x 6的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行,每列,每條對角線(包括兩條主對角線的所有對角線)上都至多有一個棋子。列號上面的佈局可以用序列2 4 6 1 3 5來描述,第i個數

for迴圈和演算法的執行效率比較c語言

實驗目的 在程式語言中,對比不同程式設計風格的程式碼寫法,或者通過使用不同的編譯器和編譯優化引數,通過編譯器生成彙編程式碼,靜態分析所生成彙編程式碼的執行效率。 實驗平臺、工具 在window 7平臺下,採用vc++ 6.0編譯器來編寫相應的C程式,然後通過UltraCom

演算法求老鼠走迷宮C語言

  /*說明老鼠走迷宮是遞迴求解的基本題型,我們在二維陣列中使用2表示迷宮牆壁, 使用1來表示老鼠的行走路徑,試以程式求出由入口至出口的路徑。 解法老鼠的走法有上、左、下、右四個方向,在每前進一格之後就選一個方向前進, 無法前進時退回選擇下一個可前進方向,如此在陣列中依序測

C語言演算法的學習

一、初識遞迴 程式呼叫自身的程式設計技巧稱為遞迴( recursion)。 一個過程或函式在其定義或說明中有直接或間接呼叫自身的一種方法,它通常把一個大型複雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少

資料結構演算法—漢諾塔

漢諾塔的問題,也是一個經典的遞迴演算法問題。 下面是自己總結的一張整體流程圖。 下面是程式碼,程式碼雖簡單,但理解其內部執行原理很重要。 //=========================

演算法二叉樹、N叉樹先序、中序、後序、BFS、DFS遍歷的和迭代實現記錄Java版

        本文總結了刷LeetCode過程中,有關樹的遍歷的相關程式碼實現,包括了二叉樹、N叉樹先序、中序、後序、BFS、DFS遍歷的遞迴和迭代實現。這也是解決樹的遍歷問題的固定套路。 一、二叉樹的先序、中序、後序遍歷  1、遞迴模板  (1)

皇后問題回溯非演算法的C語言實現文中是C語言的基本語法

    之前在CSDN的部落格上看到過大神們寫的回溯非遞迴程式碼,無奈C語言屬於初級階段無法理解位運算子等,所以自己寫了一個,此演算法雖不算簡潔,但看完應該就能理解演算法所要表達的思想。小弟的第一篇部落格,大神勿噴 #include<stdio.h> int ch

演算法詳細分析-> C

C通過執行時堆疊支援遞迴函式的實現。遞迴函式就是直接或間接呼叫自身的函式。 許多教科書都把計算機階乘和菲波那契數列用來說明遞迴,非常不幸我們可愛的著名的老潭老師的《C語言程式設計》一書中就是從階乘的計算開始的函式遞迴。導致讀過這本經書的同學們,看到階乘計算第一個想法就是遞迴

遞迴演算法問題 有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不會死。問 第20個月的兔子總對數為多少?提示先分析兔子的增長規律

遞迴演算法問題: 有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不會死。問: 第20個月的兔子總對數為多少?(提示:先分析兔子的增長規律) 程式碼

臨時重發復旦大學 在職軟件工程碩士雙證2017年入學考試 參考書推薦

出版 tle 推薦 dev 書籍 理解 工程 ticket 考研 【臨時重發】復旦大學 在職軟件工程碩士(雙證)2017年入學考試 參考書推薦 2017-06-04 MSE熱線 復旦MSE熱線 (一)統考科目:(除了政治時政版(現在還沒有),不一定要所謂2018版)

Unity編程歐拉角與萬向節死鎖圖文版

num 接頭 標記 轉發 b2c 出現 spl 探索 質量 萬向節死鎖(Gimbal Lock)問題 上文中以前說過,歐拉旋轉的順規和軸向定義,自然造就了“萬向節死鎖”問題。本文主要來探索它自然形成的原因。 陀螺儀 首先。我們來了解Gimbal

Python全棧學習筆記day 17函式之二分法老男孩Python全棧學習s9 day17 二分法程式有些問題

遞迴函式 遞迴 : 在函式中呼叫自身函式 最大遞迴深度預設是997/998 —— 是python從記憶體角度出發做得限制 二分法: 實現程式: 最基礎版:(很多問題:切分導致出現了新列表,無法返回元素在 l 中的位置) l = [2,3,5,10,15,16,

c++鞏固練習c++實現日期計算器、日期萬年曆日期類

<pre class="cpp" name="code">#include "Date.h" bool Date::operator==(const Date& d) { return _year==d._year && _month==d._month &&a

Java面試題spring+springMVC+mybatis原理及實現機制持續更新

本文將持續更新,主要講解SSM框架的底層原理和實現機制等 1.什麼是IOC? IOC即Inverse of Control,它包括兩個內容:控制與反轉 那到底什麼東西的“控制”被“反轉”了呢?對於軟體而言,即是某一個介面具體實現類的選擇控制權從呼叫類中移除,轉交給第三

轉載[海莉zhe] 每日一記Unity3D 實戰練習-實現物體的映象 十四

http://www.manew.com/thread-140831-1-1.html     最近在學習如何實現物體的映象,練習了一個簡單的例子,然後和大家一起探討一下哈!物體映象的操作實際上是通過一個模型的MeshFilter 和 MeshRenderer 來獲取

Java面試題一次完整的Http請求過程非常詳細

④ 如果在hosts檔案中也沒有找到對應的條目,瀏覽器就會發起一個DNS的系統呼叫,就會向本地配置的首選DNS伺服器(本地DNS伺服器,一般是電信運營商提供的,也可以使用像Google提供的DNS伺服器)發起域名解析請求(遞迴,通過的是UDP協議向DNS的53埠發起請求,這個請求是遞迴的請求,也就是運營商的D

追光者系列HikariCP 連線池配多大合適第一彈

點選上方“芋道原始碼”,選擇“置頂公眾號”技術文章第一時間送達!原始碼精品專欄 經驗值&

一些利用思想的簡單程式設計題JS實現

1. 使用遞迴函式計算1+2+...100的值。2. 定義函式,宰相的麥子:相傳古印度宰相達依爾,是國際象棋的發明者。   有一次,國王因為他的貢獻要獎勵他,問他想要什麼。   達依爾說:“只要在國際象棋棋盤上(共64格)擺上這麼些麥子就行了:   第一格一粒,第二格兩粒,…

Python網路爬蟲Python維基百科網頁抓取BeautifulSoup+Urllib2

引言: 從網路提取資料的需求和重要性正在變得越來越迫切。 每隔幾個星期,我都會發現自己需要從網路中提取資料。 例如,上週我們正在考慮建立一個關於網際網路上可用的各種資料科學課程的熱度和情緒指數。 這不僅需要找到新的課程,而且還要抓住網路的評論,然後在

php實現無限級分類樹牛逼

轉載路徑:http://www.php.cn/php-weizijiaocheng-353267.html 無限級樹狀圖可以說是無限級欄目的一個顯著特徵,我們接下來就來看看兩種不同的寫法。 一.資料庫設計 1 2 3