分治法实例

分治法实例

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];
                }
            }
        }
    }
}

上述代码运行结果如下:
在这里插入图片描述

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