分治

作者: _弓长_大人 | 来源:发表于2018-09-25 12:45 被阅读7次

一、棋盘覆盖问题

题意:在一个2k×2k个方格组成的棋盘中,若有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一个特殊棋盘.显然特殊方格在棋盘上出现的位置有4k种情形.因而对任何k≥0,有4k种不同的特殊棋盘.将 2^k x 2^k 的特殊棋盘化成
4个 2^(k-1) x 2^(k-1)
4个中必然存在一个特殊棋盘,和三个没有特殊棋子的棋盘,为了成为相同的子问题,于是将这 三个棋盘 处理成 特殊棋盘,即加一个特殊棋子。
原来 4x4,1 表示特殊棋子
1 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0

分为
1 0 0 0
0 0 0 0

0 0 0 0
0 0 0 0
-》其他三个变为 特殊棋盘 *

1 0 0 0
0 0 * 0

0 * * 0
0 0 0 0
星号组成的 图形 刚好可以 用 题目给出的 覆盖

#include <string.h>
#include <iostream>
#include <stdio.h>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include<cstdio>
using namespace std;
int mapp[20][20];
int t = 1;
void fun(int x, int y, int dx, int dy, int size)
{
    if (size == 1)
    {
        return;
    }
    int tt = t++;
    int m = size / 2;
    if (x + m > dx&&y + m > dy)//1 象限
    {
            fun(x, y, dx, dy, m);
    }
    else
    {
        mapp[x + m - 1][y + m - 1] = tt;
        fun(x, y, x + m - 1, y + m - 1, m);
    }



    if (x + m > dx&&y + m <= dy)// 2 象限
    {
        fun(x, y+m, dx, dy, m);
    }
    else
    {
        mapp[x + m-1][y + m] = tt;
        fun(x, y+m, x + m-1, y + m , m);
    }


    if (x + m <= dx&&y + m > dy)//3 象限
    {
        fun(x+m, y, dx, dy, m);
    }
    else
    {
        mapp[x +m][y + m-1 ] = tt;
        fun(x+m, y, x + m , y + m-1 , m);
    }
    if (x + m <= dx&&y + m <= dy)//4 象限
    {
        fun(x+m, y+m, dx, dy, m);
    }
    else
    {
        mapp[x + m ][y + m ] = tt;
        fun(x+m, y+m, x + m , y + m , m);
    }
}
int main()
{
    int k;
    int x, y;
    cin >> k >> x >> y;
    mapp[x][y] = 0;
    fun(0,0, x, y, k);
    for (int i = 0; i < k; i++)
    {
        for (int j = 0; j < k; j++)
        {
            printf("%4d", mapp[i][j]);
        }
        cout << endl;
    }
    return 0;
}

相关文章

  • 分治算法

    文章结构 如何理解分治算法 分治算法应用举例 1. 如何理解分治算法 1.1 分治算法的核心思想 分治算法的核心思...

  • 归并排序

    1、分治法 归并排序是完全遵循分治策略的排序算法。什么是分治法? 分治法,即将原问题分解为几个规模较小的子问题,递...

  • 基本算法

    分治 分治分治,即分而治之。分治,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问...

  • 分治

    一、基本概念 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或...

  • 分治

    一、棋盘覆盖问题 题意:在一个2k×2k个方格组成的棋盘中,若有一个方格与其他方格不同,则称该方格为一特殊方格,且...

  • 分治

    数列分治 POJ 1854: Evil Straw Warts Live题解链接 http://www.hankc...

  • 分治

    分治,字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问...

  • 分治

    1.思想 分治思想顾名思义,分而治之。我们把一个规模n的问题进行划分为一个一个我们能简单解决的问题,然后合并结果得...

  • 分治

    约数之和 原题链接[https://www.acwing.com/problem/content/99/]

  • Divide and Conquer

    算法之 分治法 Divide and Conquer 分治法: 分治法的设计思想是:将一个难以直接解决的大问题,分...

网友评论

      本文标题:分治

      本文链接:https://www.haomeiwen.com/subject/blkrzttx.html