棋盘分治

来源:互联网 发布:量化交易编程 编辑:程序博客网 时间: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;}


详情,请参考《苏犯法设计与分析》


原创粉丝点击