棋盘覆盖问题(分治法)

裁判测试程序样例:

cpp 复制代码
#include <iostream>
#include<fstream>
#include <iomanip>
#define MAX 1025
using namespace std;
int board[MAX][MAX];
int tile=1;

void ChessBoard(int tr,int tc,int dr,int dc,int size);

int main()
{
int dr,dc,size;
int j,i;
cin>>size;
cin>>dr>>dc;
ChessBoard(0,0,dr,dc,size);
for(i=0;i<size;i++){
  cout<<left; 
  for(j=0;j<size;j++)
  {
    cout<<setfill(' ')<<setw(5)<<board[i][j];
  }
  cout<<endl;
}
return 0;
} 

/* 请在这里填写答案 */

输入样例:

第一行输入一个数n表示棋盘大小,第二行输入特殊方格的行列下标。

8

1 2

输出样例:

输出棋盘。

3 3 4 4 8 8 9 9

3 2 0 4 8 7 7 9

5 2 2 6 10 10 7 11

5 5 6 6 1 10 11 11

13 13 14 1 1 18 19 19

13 12 14 14 18 18 17 19

15 12 12 16 20 17 17 21

15 15 16 16 20 20 21 21

idea

  • 问题描述

    所谓棋盘覆盖问题,可以理解为正方形划分为若干个小正方形,其中一个被标记,需找出用不同角度的L型骨牌覆盖的方案。覆盖过程中需要满足覆盖除特殊方格外的所有方格,不能重叠

  • 问题有解性证明

  • 分治法求解

solution

cpp 复制代码
void ChessBoard(int tr,int tc,int dr,int dc,int size){   
	if(size == 1) return;        //递归出口
    int t=tile++;            //取一个L型骨,其牌号为tile
    int s=size/2;            //分割棋盘
    //考虑左上角象限
    if(dr < tr + s && dc < tc + s)        //特殊方格在此象限中
		ChessBoard(tr, tc, dr, dc, s);
    else                //此象限中无特殊方格
    {    
		board[tr + s - 1][tc + s - 1] = t;    //用t号L型骨牌覆盖右下角
		ChessBoard(tr, tc, tr + s - 1, tc + s - 1, s);    //将右下角作为特殊方格继续处理该象限
    }
    //考虑右上角象限
    if(dr < tr + s && dc >= tc + s)         
		ChessBoard(tr, tc + s, dr, dc, s);        //特殊方格在此象限中 
    else                    //此象限中无特殊方格
    {    
		board[tr + s - 1] [tc + s] = t;        //用t号L型骨牌覆盖左下角
		ChessBoard(tr, tc + s, tr + s - 1, tc + s, s)
;  //将左下角作为特殊方格继续处理该象限
    }
   //处理左下角象限
    if(dr >= tr + s && dc < tc + s)        //特殊方格在此象限中
		ChessBoard(tr + s, tc, dr, dc, s);  
    else                //此象限中无特殊方格
    {   
		board[tr + s][tc + s - 1] = t;      //用t号L型骨牌覆盖右上角
        ChessBoard(tr + s, tc, tr + s, tc + s - 1, s);    //将右上角作为特殊方格继续处理该象限
    }
    //处理右下角象限
    if(dr >= tr + s && dc >= tc + s)        //特殊方格在此象限中
        ChessBoard(tr + s, tc + s, dr, dc, s); 
    else                //此象限中无特殊方格
    {    
		board[tr + s][tc + s] = t;      //用t号L型骨牌覆盖左上角
 		ChessBoard(tr + s, tc + s, tr + s, tc + s, s);      //将左上角作为特殊方格继续处理该象限
    }
}
相关推荐
星星.7222 小时前
C++算法竞赛|二分查找与二分答案:边界模板、浮点二分、STL
数据结构·c++·算法
sel_92 小时前
【OPD论文导读(二)】OPD(On-Policy Distillation)全景调研:十篇论文讲透“在自己生成的内容上学习“这件事
人工智能·python·深度学习·学习·算法·语言模型
金幄科技2 小时前
RAG第四篇:重排序 Rerank——粗召回之后,为什么还需要一次精排
人工智能·算法·ai·ai编程
M78佐菲3 小时前
Linux学习笔记:文件IO
linux·笔记·学习·算法
lhldsg3 小时前
课程排课系统实战指南:从数据库设计到算法调优全流程解析
java·数据库·算法·小程序
BSD_HY3 小时前
薄膜开关矩阵扫描电路设计中的防鬼键措施
人工智能·算法·矩阵·人机交互·薄膜开关·源头工厂·深圳工厂
linux-hzh3 小时前
百日算法修炼 · Day 17
数据结构·算法
XUEYUAN52123 小时前
代理日志分析与监控:代理池健康状态巡检与分级告警体系搭建(运维实战)
运维·网络·网络协议·tcp/ip·算法·架构
sel_94 小时前
【多轮对话论文导读(七)】多轮对话论文阅读笔记:从数据生成、用户模拟到上下文重构与长期记忆
论文阅读·人工智能·笔记·深度学习·算法·语言模型·自然语言处理
远游客07134 小时前
为什么用「年×100+月」做比较
算法·gin