棋盘覆盖【递归分治法】

来源:互联网 发布:网络暴力 论文 编辑:程序博客网 时间:2024/05/18 22:40

棋盘覆盖问题的讨论,求解
题目是这样的:N*N的棋盘上,需要用L型骨牌覆盖,只能保证一个特殊字格空出来,给出特殊字格的位置,求出所有的L型骨牌的摆放位置。

#include<iostream>using namespace std;#define n 16#define a 1#define b 1int Board[n][n];int t=0;void Input();void ChessBoard(int tr,int tc,int dr,int dc,int size);void Print();int main(){    Input();    ChessBoard(0,0,a,b,n);    Print();    return 0;}void Input(){    int i,j;    for(i=0; i<n;i++)        for(j=0; j<n;j++)            Board[i][j]=-1;        Board[a][b]=0;}void ChessBoard(int tr,int tc,int dr,int dc,int size){    if(size==1)        return ;    t++;    int x=t;//这一步至关重要,它将是每次递归的同一层次的编号不变    size=size/2;    if(tr+size>dr && tc+size>dc)        ChessBoard(tr,tc,dr,dc,size);    else{        Board[tr+size-1][tc+size-1]=x;         ChessBoard(tr,tc,tr+size-1,tc+size-1,size);//看这里    }    if(tr+size<=dr && tc+size>dc)        ChessBoard(tr+size,tc,dr,dc,size);    else{        Board[tr+size][tc+size-1]=x;        ChessBoard(tr+size,tc,tr+size,tc+size-1,size);    }    if(tr+size>dr && tc+size<=dc)        ChessBoard(tr,tc+size,dr,dc,size);    else{        Board[tr+size-1][tc+size]=x;        ChessBoard(tr,tc+size,tr+size-1,tc+size,size);    }    if(tr+size<=dr && tc+size<=dc){        ChessBoard(tr+size,tc+size,dr,dc,size);    }    else{        Board[tr+size][tc+size]=x;        ChessBoard(tr+size,tc+size,tr+size,tc+size,size);    }}void Print(){    int i,h;    for(i=0;i<n;i++){        for(h=0;h<n;h++)            cout<<Board[i][h]<<" ";        cout<<endl;    }}

笔记:这是一个用分治递归的思想写的算法、第一次发出来的时候,有朋友评论帮助我找出了问题,确实在递归的运行过程中,很容易发生这种所谓的参数丢失和参数混乱的问题,进行变量是一个好办法,对于这种问题的处理。

问题:很不幸,问题又发生了,在数量级增加的同时,数据出现了很大的问题,给出截图如下,求讨论。

这里写图片描述
欢迎大家给出自己的意见。

解决方案:

其实这个问题挺傻的,最后经过我坤神的严密搜查,结果找到的原因是在C++中中括号的编译问题。在代码里有个地方注释着“看这里”,这个错误就是之前把“()”写成了“[]”,造成的。
在C++中这种错误不知道为什么会给编译,但是c语言中还是没有的,所以觉得c的编译还是很给力的,c++的编译很有问题。

这个是最终的图:
这里写图片描述

原创粉丝点击