棋盘覆盖算法
2016-04-06 23:26
288 查看
问题描述
在一个2^k×2^k 个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,用4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。就是这样一个问题,上面的懒得敲得,就百度了一篇博客文章上复制的。这点是需要声明的。
分治策略
分治的基本思想便是讲一个规模为n的问题分解成k个规模较小的子问题,这些子问题互相独立与原问题相同。递归地解决这些子问题,然后将各个子问题的解合在一起,就是原问题的解。在第一次接触棋盘问题,就有点疑问,图形怎么显示呢,有点呆。就像第一次写一个比较大的C语言程序的时候,需要有个选择菜单,开始的时候怎么都想不明白,老是纠结这个问题,很烦,但是看到同学的程序的时候,我有点哭笑不得,怎么会这样?算了吧,我还是默默接受吧。在本例中使用二维数组打印结果,算是这样吧,反正当时幼稚的想法还会浮现在脑海中。
代码如下
写在这里有点羞愧,代码是参考网上有些博主的,当时一下子没有想明白,就求助了度娘。有点虚,所以大家看看就好,不要太过纠结于细节,重要的是领悟分治的思想。#include <stdio.h> #include <stdlib.h> #include <memory.h> int tile=0; int Board[100][100]; void ChessBoard(int tr,int tc,int dr,int dc,int size); int main() { int size,r,c,row,col; memset(Board,0,sizeof(Board)); scanf("%d",&size); scanf("%d%d",&row,&col); ChessBoard(0,0,row,col,size); for(r=0;r<size;r++) { for(c=0;c<size;c++) { printf("%2d",Board[r][c]); } printf("\n"); } return 0; } void ChessBoard(int tr,int tc,int dr,int dc,int size) { int t,s; if(size==1) return; t=tile++; 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; 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; 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; 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; ChessBoard(tr+s,tc+s,tr+s,tc+s,s); } }
结束
大家自己测试吧,图就不上了。相关文章推荐
- jQuery学习笔记 —— 1. 选择器
- UIPickerView的应用
- 为什么需要架构图,怎么画?
- solr学习之一 搜索基本知识
- SDAU 搜索专题 12 Rescue
- FFMPEG源码分析
- StringBuffer和StringBuilder的区别
- Linux 常用命令
- Linux下安装JDK1.8
- Gray码生成
- JS引用类型Object
- [IO]——文件复制
- Qt Mac OS、iOS和X11的Retina显示支持
- python变量和作用域
- 【一天一道LeetCode】#11Container With Most Water
- 【一天一道LeetCode】#11Container With Most Water
- Java中九种基本数据类型以及他们的封装类
- 在VS2015中用C++创建DLL并用C++调用且同时实现对DLL的调试
- JAVA 中BIO,NIO,AIO的理解
- 作业4