棋盘分治
来源:互联网 发布:量化交易编程 编辑:程序博客网 时间:2024/04/29 19:29
#include "stdafx.h"#include <stdlib.h>#include <stdio.h> /*(tr, tc): 棋盘左上角的行号,列号(dr, dc): 棋盘右上角的行号,列号size:当前棋盘的大小 = 2 ^k*/#define EDGE_LEN 8int board[EDGE_LEN][EDGE_LEN];int title = 0;void putArray(){for(int i = 0; i < EDGE_LEN; i++){for(int j = 0; j < EDGE_LEN; j++){printf("%4d", board[i][j]);}printf("\n");}}void chessBoard(int tr, int tc, int dr, int dc, int size){if(size == 1)return;int s = size / 2; //分割棋盘,长宽都变为一半int t = ++title; //L型骨牌的编号//如果L型骨牌在左上角if(dr < tr + s && dc < tc + s)chessBoard(tr, tc, dr, dc, s);else//否则将其右下角填充(是L型骨牌的一部分,与另外三个不存在特殊方格的形成L型骨牌),构造一个特殊方格{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);}}int main(){for(int i = 0; i < EDGE_LEN; i++){for(int j = 0; j < EDGE_LEN; j++){board[i][j] = -1;}}board[0][0] = 0;chessBoard(0, 0, 0, 0, EDGE_LEN );putArray();system("pause");return 0;}
详情,请参考《苏犯法设计与分析》
- 棋盘分治
- 棋盘覆盖(分治-递归)
- 棋盘划分----分治算法
- 分治法,棋盘覆盖
- 棋盘覆盖问题【分治】
- 分治--残缺棋盘
- 棋盘覆盖-分治
- 分治算法-残缺棋盘
- 分治法:棋盘覆盖
- 分治算法--棋盘覆盖
- 分治-棋盘覆盖问题
- 分治-棋盘覆盖
- 残缺棋盘 【分治】
- 棋盘覆盖(分治、递归)
- 棋盘覆盖问题(分治)
- 分治算法---棋盘覆盖
- 分治递归 棋盘问题
- 棋盘问题(分治)
- (转载)C# Helper Object( Helper命名的类的含义 )
- UIView 和 CALayer的那点事
- mac下编译ffmpeg
- SimpleAudioEngine类的介绍
- 关于新浪微博SSO授权时出现 Weibo-authorize Failed to receive access token by SSO 的问题解决
- 棋盘分治
- 利用Application在同一应用的各个activity传值
- 二叉树遍历算法(非递归)
- 黑马程序员--C#运算符
- 从:非洲发现生长速度最快的鱼 想到的
- linux性能书籍
- 【外国文学史有感】
- 开源代码网站
- Android 实现apk文件下载并自动安装