分治算法经典案例 - 棋盘问题

2017-08-26 20:18:50

writer:pprp

问题大概描述:

有一个2k?2k的方格棋盘,恰有一个方格是黑色的,其他为白色。你的任务是用包含3个方格的L型牌覆盖所有白色方格。

黑色方格不能被覆盖,且任意一个白色方格不能同时被两个或更多牌覆盖。

用分治法来解决,分治的时候要确定状态,需要什么状态,结束条件

结束条件是size规模变成了1的时候,就要退出了;

需要的状态,起始点,黑色块的位置,size边长

/*
@theme:棋盘用L型的块堆满
@writer:pprp
@declare:最经典的分治算法
@date:2017/8/26
*/
#include <bits/stdc++.h>
#include <iostream>

using namespace std;
const int maxn = 10000;
int chess[maxn][maxn];
int number;

void chessBoard(int row, int column, int x, int y, int Size)
{
       if(Size == 1) return ;//退出条件
       int ss = Size/2;//分治,规模减半

       int t = ++number;
       int centerRow = row + ss;
       int centerColumn = column + ss;

       //开始判断四个方向
       //左上角判断
       if(x < centerRow && y < centerColumn)
       {
             chessBoard(row,column,x,y,ss);
       }
       else
       {
             chess[centerRow-1][centerColumn-1] = t;
             chessBoard(row,column,centerRow-1,centerColumn-1,ss);
       }

       //右上角判断
       if(x < centerRow && y >= centerColumn)
       {
             chessBoard(row,centerColumn,x,y,ss);
       }
       else
       {
             chess[centerRow-1][centerColumn] = t;
             chessBoard(row,centerColumn,centerRow-1,centerColumn,ss);
       }

       //左下角判断
       if(x >= centerRow && y < centerColumn)
       {
             chessBoard(centerRow,column,x,y,ss);
       }
       else
       {
             chess[centerRow][centerColumn-1] = t;
             chessBoard(centerRow,column,centerRow,centerColumn-1,ss);
       }                                                                   

       //右下角判断
       if(x >= centerRow && y >= centerColumn)
       {
             chessBoard(centerRow,centerColumn,x,y,ss);
       }
       else
       {
             chess[centerRow][centerColumn] = t;
             chessBoard(centerRow,centerColumn,centerRow,centerColumn,ss);
       }

}

int main()
{
      int Size;
      int x, y;
      while(cin >> Size && Size)
      {
            memset(chess, 0, sizeof(chess));
            cin >> x >> y;
            chessBoard(0,0,x,y,Size);
            chess[x][y] = number = 1;        

            for(int i = 0 ; i < Size; i++)
            {
                  for(int j = 0 ; j < Size ; j++)
                  {
                        cout << chess[i][j]<< "\t";
                  }
                  cout << endl << endl;;
            }
      }

      return 0;
}
时间: 2024-09-30 13:22:12

分治算法经典案例 - 棋盘问题的相关文章

【棋盘覆盖】(简单)--分治算法

算法实验1:棋盘覆盖 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 2798  Solved: 702 [Submit][Status][Discuss] Description 在一个2k x 2k 个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘.在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖. 口            

【LeetCode-面试算法经典-Java实现】【036-Valid Sudoku(验证数独棋盘)】

[036-Valid Sudoku(验证数独棋盘)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be partially filled, where empty cells are filled with the character '.'. A partially fi

TensorFlow经典案例2:实现最近邻算法

本次案例需要大家了解关于手写数字识别(mnist)的数据集的特点和结构: #TensorFlow实现最近邻算法 #次案例的前提是了解mnist数据集(手写数字识别) import tensorflow as tf import numpy as np from tensorflow.examples.tutorials.mnist import input_data #导入mnist数据集 mnist = input_data.read_data_sets("/tmp/data/",

算法学习——分治算法

这是从网上查到的概念资料,先收来~ 一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时间都与其规模有关.问题的规模越小,越容易直接求解,解题所需的计算时间也越少.例如,对于n个

五大算法—分治算法

分治算法 一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时间都与其规模有关.问题的规模越小,越容易直接求解,解题所需的计算时间也越少.例如,对于n个元素的排序问题,当n=1时

(转)五大常用算法之一:分治算法

http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741370.html 分治算法 一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的

(转)五大常用算法之一:分治算法

五大常用算法之一:分治算法 一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时间都与其规模有关.问题的规模越小,越容易直接求解,解题所需的计算时间也越少.例如,对于n个元素的排

分治算法学习 Divide and Conquer

分治思想: 分治算法的思想就是 对于某些特定种类的问题  如果问题的规模很小,那么就直接解决,如果问题的规模比较大,那么就把问题先分解为规模小的但是问题相同的子问题 ,并且不断分解直到规模足够小,再递归地解决这些问题 如果原问题可分割成k个子问题,1<k≤n,且这些子问题都可解并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的. 递归与分治经常是一起使用的 能够用分治的情况 : 1.问题复杂性随规模减小而减小 2.问题具有最优子结构性质        最优子结构:如果问题的最优解所包

五大常用算法之一:分治算法(转)

五大常用算法之一:分治算法 分治算法 一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时间都与其规模有关.问题的规模越小,越容易直接求解,解题所需的计算时间也越少.例如,对于n