欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

分治法实例

程序员文章站 2022-06-03 16:53:44
...

分治法实例

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

上述代码运行结果如下:
分治法实例

相关标签: # 分治法