1. 程式人生 > >王曉東老師《計算機演算法設計與分析》棋盤覆蓋問題完整程式

王曉東老師《計算機演算法設計與分析》棋盤覆蓋問題完整程式

說明:下面的程式對應於王曉東老師《計算機演算法設計與分析(第4版)》的棋盤覆蓋問題。

其中chessBoard函式來自於王曉東老師的著作,本人編寫了display函式和main函式。

#include <stdio.h>
int board[8][8];
int tile;
void chessBoard(int tr, int tc, int dr, int dc, int size)
{
      if (size == 1) return;
      int t = tile++,  // L型骨牌號
        s = size/2;  // 分割棋盤
      // 覆蓋左上角子棋盤
      if (dr < tr + s && dc < tc + s)
         // 特殊方格在此棋盤中
         chessBoard(tr, tc, dr, dc, s);
      else {// 此棋盤中無特殊方格
         // 用 t 號L型骨牌覆蓋右下角
         board[tr + s - 1][tc + s - 1] = t;
         // 覆蓋其餘方格
         chessBoard(tr, tc, tr+s-1, tc+s-1, s);}
      // 覆蓋右上角子棋盤
      if (dr < tr + s && dc >= tc + s)
         // 特殊方格在此棋盤中
         chessBoard(tr, tc+s, dr, dc, s);
      else {// 此棋盤中無特殊方格
         // 用 t 號L型骨牌覆蓋左下角     
        board[tr + s - 1][tc + s] = t;
         // 覆蓋其餘方格
         chessBoard(tr, tc+s, tr+s-1, tc+s, s);}
        // 覆蓋左下角子棋盤
      if (dr >= tr + s && dc < tc + s)
         // 特殊方格在此棋盤中
         chessBoard(tr+s, tc, dr, dc, s);
      else {// 用 t 號L型骨牌覆蓋右上角
         board[tr + s][tc + s - 1] = t;
         // 覆蓋其餘方格
         chessBoard(tr+s, tc, tr+s, tc+s-1, s);}
      // 覆蓋右下角子棋盤
      if (dr >= tr + s && dc >= tc + s)
         // 特殊方格在此棋盤中
         chessBoard(tr+s, tc+s, dr, dc, s);
      else {// 用 t 號L型骨牌覆蓋左上角
         board[tr + s][tc + s] = t;
         // 覆蓋其餘方格
         chessBoard(tr+s, tc+s, tr+s, tc+s, s);}
}

void display()
{
	int r,c;
	for(r=0;r<8;r++)
	{
		for(c=0;c<8;c++)
			printf("%2d ",board[r][c]);
		printf("\n");
	}
}

int main()
{
	tile=1;
	chessBoard(0,0,2,2,8);
	display();
	return 0;
}

程式的執行結果截圖:


相關推薦

老師計算機演算法設計分析棋盤覆蓋問題完整程式

說明:下面的程式對應於王曉東老師《計算機演算法設計與分析(第4版)》的棋盤覆蓋問題。其中chessBoard函式來自於王曉東老師的著作,本人編寫了display函式和main函式。#include <stdio.h> int board[8][8]; int ti

計算機演算法設計分析 第4版 () 課後答案[1-9章]》pdf版電子書附下載連結+30個總結JVM虛擬機器的技術文排版好(收藏版)

技術書閱讀方法論 一.速讀一遍(最好在1~2天內完成) 人的大腦記憶力有限,在一天內快速看完一本書會在大腦裡留下深刻印象,對於之後複習以及總結都會有特別好的作用。 對於每一章的知識,先閱讀標題,弄懂大概講的是什麼主題,再去快速看一遍,不懂也沒有關係,但是一定要在不懂的

8601 最大長方體問題(優先做) 時間限制:1000MS 記憶體限制:1000K 提交次數:950 通過次數:383 計算機演算法設計分析

題目 8601 最大長方體問題(優先做) 時間限制:1000MS 記憶體限制:1000K 提交次數:950 通過次數:383 題型: 程式設計題 語言: G++;GCC;VC Description 一個長,寬,高分別是m,n,p的長方體被分割成mnp個小

計算機演算法設計分析課本(著)課後演算法實現題1-3 最多約數問題

問題描述: 正整數x的約數是能整除x的正整數。正整數x的約數個數記為div(x)。例如,1 2 5 10都是10的約數,且div(10)=4。設a和b是2個正整數,a<=b,找出a和b之間約數個數最多的數x。 演算法設計: 對於給定的2個正整數a<=b,計算a和b之間約數個數最多

計算機演算法設計分析 第2版+第3版+第4版 () 》原書附答案pdf版電子書附下載連結+30個總結JVM虛擬機器的技術文排版好(收藏版)

技術書閱讀方法論 一.速讀一遍(最好在1~2天內完成) 人的大腦記憶力有限,在一天內快速看完一本書會在大腦裡留下深刻印象,對於之後複習以及總結都會有特別好的作用。 對於每一章的知識,先閱讀標題,弄懂大概講的是什麼主題,再去快速看一遍,不懂也沒有關係,但是一定要在不懂的

計算機演算法設計分析】——SVM

一.簡介 支援向量機(support vector machines)是一種二分類模型,它的目的是尋找一個超平面來對樣本進行分割,分割的原則是間隔最大化,最終轉化為一個凸二次規劃問題來求解。由簡至繁的模型包括: (1)當訓練樣本線性可分時,通過硬間隔最大化,學習一個線性可分支援向量機;(2)當訓練樣本近似

計算機演算法設計分析】——NP

  時間複雜度 時間複雜度並不是表示一個程式解決問題需要花多少時間,而是當問題規模擴大後,程式需要的時間長度增長得有多快。也就是說,對於高速處理資料的計算機來說,處理某一個特定資料的效率不能衡量一個程式的好壞,而應該看當這個資料的規模變大到數百倍後,程式執行時間是否還是一樣,或者也跟著慢了數百倍

計算機演算法設計分析

對待問題的思路: 1、如果問題能分解成子問題,考慮分治,並且能觀察最優子結構,考慮動態規劃,如果問題有貪心性質,考慮貪心。 2、如果問題不能分或者不好分成問題,考慮逐步改進的方法,如線性規劃,非線性規劃,二次規劃,網路流等。 3、觀察解形式,x=[x1,x2,x3,x4

計算機演算法設計分析1-4 金幣陣列問題

問題描述:有m*n枚金幣在桌面上排列成一個m行n列的金幣陣列。每一枚金幣或正面朝上,或背面朝上。用數字表示金幣狀態,0表示正面朝上,1表示背面朝上。 金幣陣列遊戲的規則是:     (1)每次將任一行金幣翻過來放在原來的位置上。     (2)每次可以任選2列,交換這2

計算機演算法設計分析——半數集問題

這裡用來解決《計算機演算法設計與分析(第四版)》第二章課後作業的“半數集問題”,話不多說,上原始碼: 執行結果是兩個txt檔案。 請大家多多指點,謝謝! #include<stdio.h> #include<stdlib.h> int Han

計算機演算法設計分析 (四) 貪心演算法--單源最短路徑

1.Dijkstra演算法是解決單源最短路徑的一個貪心演算法。給定一個帶權有向圖G=(V,E),其中每條邊的權都是非負實數,另外,還給定V中的一個頂點,稱為源。現在要計算源到其他各個頂點的最短路長度。這裡的路的長度指的是路上各邊權之和。 Dijkstra演算法可

計算機演算法設計分析之遞迴分治策略——二分搜尋技術

遞迴與分治策略 二分搜尋技術   我們所熟知的二分搜尋演算法是運用分治策略的典型例子,針對這個演算法,先給出一個簡單的案例。   目的:給定已排好序的n個元素a[0:n-1],現要在這n個元素中找出一特定的元素x。   我們首先想到的最簡單的是用順序搜尋方法,逐個比較a[0:n-1]中元素,直至找出元

計算機演算法設計分析學習筆記1

基本概念 程式 = 演算法 + 資料結構 演算法描述如何解決一類問題的一種方法,滿足如下性質: -輸入:一類問題的例項 - 輸出:針對例項的解 - 確定性:每條指令無歧義 - 有限性:有限迴圈 程式 不滿足有限性性質, eg. 作業系統為無限

計算機演算法設計分析觀後小總結

簡單略看了一遍王曉東的《計算機演算法設計與分析》,很多地方沒有細看,現在先做個小總結,方便以後回頭看的時候記憶起一些內容。 第二章:遞迴與分治策略 遞迴的概念: 直接或間接地呼叫自身的演算法稱為遞迴演算法。用函式自身給出定義的函式稱為遞迴函式。 分治法的基本思想: 分治法的

計算機演算法設計分析——遞迴分治策略(一)

遞迴: 直接或者間接地呼叫自身的演算法稱為遞迴。用函式自身給出定義的函式成為遞迴函式。 使用遞迴技術往往使函式的定義和演算法的描述簡潔且易於理解。有些資料結構,如二叉樹等,由於其本身固有的遞迴特性,特別適合用遞迴的形式來描述。另外,還有一些問題,雖然其本身沒

計算機演算法設計分析”期末考點以及應試思路-D_Dan

申明:純屬個人觀點,僅供大家參考,最後預祝大家取得好成績WINNER WINNER ,ALGORITHM IS FULL MARKS! 1、演算法是指解決問題的一種方法或一個過程。演算法是由若干條指令組成的有序序列。 2、演算法的性質 輸入:有零個或多個由外部提供的量作為

演算法設計分析——動態規劃(一)矩陣連乘

動態規劃——Dynamic programming,可以說是本人一直沒有啃下的骨頭,這次我就得好好來學學Dynamic programming. OK,出發! 動態規劃通常是分治演算法的一種特殊情況,它一般用於最優化問題,如果這些問題能夠: 1.能夠分解為規模更小的子問題 2.遞迴的

演算法設計分析——分治法

前言 本文重點回顧了卜老師課堂上關於分治演算法的一些常見的問題。加油吧!ヾ(◍°∇°◍)ノ゙ 分治法(Divide and Conquer) 當面對一個問題的時候,我們可能一下子找不到解決問題的方法。此時,我們可以考慮將問題規模最小化,先看看當問題規模變小以後,我們如何去解決

演算法設計分析04-排序問題

①氣泡排序:量量比較待排序資料元素的大小,發現兩個資料元素的次序相反時進行交換,直到沒有反序的資料元素為止。時間複雜度是O(n*2)。穩定的。下面給出兩種排序演算法,我比較喜歡第二種,因為第二種才能真正解釋冒泡的原理 public class bubble1 {    &n

演算法設計分析03-十進位制轉二進位制問題

10進位制數轉2 進位制數 題目:2 進位制除了 0,1,還可以用 2 表示。例如: 1-> 1 2-> 10 or 02 3->11 4 ->100 or 020 or 012 問題:這樣一個十進位制數轉為二進位制數,就不是唯一的了。現求十進位制數 N 轉換為這種二進位制數