分治法實例

分治法實例

1.基本思想

(1)分解:將要求解的問題用若干較小的同類子問題
(2)求解:當問題被劃分得足夠小的時候,用簡單方法解決
(3)合併:根據求解的問題,將子問題的接解逐層合併得到原問題的最終解

2.實例

視頻教程
在這裏插入圖片描述
上圖有個小錯誤,選手二的第5天爲5

import org.junit.Test;
public class Math {
    @Test
    public void Test() {
        Solution solution = new Solution(4);
        solution.GameMap(1,4);
        for(int i=1;i<solution.a.length;i++)
        {
            for(int j=0;j<solution.a[i].length;j++)
                System.out.print(solution.a[i][j]+" ");
            System.out.println();
        }
    }
}
//分治法兵乓球賽制表講解
class Solution {
    int a[][];
    public Solution(int N)
    {
        this.a = new int[N+1][N];
    }
    //從第K號選手開始的n個選手(包括k)
   void GameMap(int k,int n)
    {
        //等於2時表示在表的最左端
        if(n==2)
        {
            this.a[k][1] = k+1;
            this.a[k][0]=k;
            this.a[k+1][0]=k+1;
            this.a[k+1][1]=k;
        }
        else
        {
            GameMap(k,n/2);
            GameMap(k+n/2,n/2);
            //填充右下角
            for(int i=k;i<=k+n/2-1;i++)
            {
                for(int j=0;j<=n/2-1;j++)
                {
                    this.a[i+n/2][j+n/2] = a[i][j];
                }
            }
            //填充右上角
            for(int i=k+n/2;i<=k+n-1;i++)
            {
                for(int j=0;j<=n/2-1;j++)
                {
                    this.a[i-n/2][j+n/2] = a[i][j];
                }
            }
        }
    }
}

上述代碼運行結果如下:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章