c语言问题-棋盘覆盖算法部分理解困难

问题描述

棋盘覆盖算法部分理解困难

#include
using namespace std;
const int N = 11;
int Board[N][N];
int tile = 0;

/*
tr:棋盘左上角方格的行号
tc:棋盘左上角方格的列号
dr:特殊方格所在的行号
dc:特殊方格所在的列号
size:方形棋盘的边长
*/
void ChessBoard(int tr, int tc, int dr, int dc, int size)
{
if(size == 1)
return;
int t = ++tile, s = size/2;

//覆盖左上角子棋盘
if(dr<tr+s && dc<tc+s)
    //特殊方格在此棋盘中
    ChessBoard(tr, tc, dr, dc, s);
else   // 此棋盘无特殊方格
{
    // 用t号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);
}

}

void DisplayBoard(int size)
{
for(int i=1; i<=size; ++i)
{
for(int j=1; j<=size; ++j)
printf("%2d ", Board[i][j]);
printf("n");
}
}

int main()
{
ChessBoard(1, 1, 1, 2,8);
DisplayBoard(8);
return 0;
}

我想知道加粗部分覆盖的时候数组下标好像越界了,是如何正常运行的,不太理解

时间: 2024-08-30 21:35:24

c语言问题-棋盘覆盖算法部分理解困难的相关文章

棋盘覆盖问题的算法实现

本文为原创,如需转载,请注明作者和出处,谢谢!     在一个2^k * 2^k个方格组成的棋盘中,有一个方格与其它的不同,若使用以下四种L型骨牌覆盖除这个特殊方格的其它方格,如何覆盖.     四各L型骨牌如下图1       图1  棋盘中的特殊方格如图2 图2     实现的基本原理是将2^k * 2^k的棋盘分成四块2^(k - 1) * 2^(k - 1)的子棋盘,特殊方格一定在其中的一个子棋盘中,如果特殊方格在某一个子棋盘中,继续递归处理这个子棋盘,直到这个子棋盘中只有一个方格为止如

桶排序算法的理解及C语言版代码示例_C 语言

理解:桶排序是计数排序的变种,把计数排序中相邻的m个"小桶"放到一个"大桶"中,在分完桶后,对每个桶进行排序(一般用快排),然后合并成最后的结果.基本思想:桶排序假设序列由一个随机过程产生,该过程将元素均匀而独立地分布在区间[0,1)上.我们把区间[0,1)划分成n个相同大小的子区间,称为桶.将n个记录分布到各个桶中去.如果有多于一个记录分到同一个桶中,需要进行桶内排序.最后依次把各个桶中的记录列出来记得到有序序列.效率分析:桶排序的平均时间复杂度为线性的O(N+C

c语言-求教C语言判断素数程序算法,为何j&amp;amp;lt;=sqrt((double)i )??

问题描述 求教C语言判断素数程序算法,为何j<=sqrt((double)i )?? #include #include void fun(int a, int b, int *c) { int i,j,d,y; for (i=3;i<=a/2;i=i+2) { /************found**************/ y=1; for (j=2;j<=sqrt((double)i );j++)//??为何j<=sqrt((double)i )?? if (i%j==0)

既然java语言提供了排序算法的封装,为什么我们还要自己写冒泡

问题描述 既然java语言提供了排序算法的封装,为什么我们还要自己写冒泡 一个关于排序的问题:既然java语言提供了排序算法的封装,为什么我们还要自己写冒泡排序?什么时候用到冒泡排序? 解决方案 目的是为了让你学习,冒泡排序是最容易理解的排序算法. 解决方案二: Java语言写的各种排序算法[未完] 解决方案三: java封装好的是快排吧,首先快排是不稳定排序,只是平均时间复杂度最低而已.简单排序中直接插入最好,快速排序最快,当文件为正序时,直接插入和冒泡均最佳.当数据量过大时堆排序的优势又体现

c语言-C语言中关于矩阵算法的问题

问题描述 C语言中关于矩阵算法的问题 从一个m×n的整数矩阵中,找到x×y的子矩阵,使子矩阵中所有元素的和最大,并输出和及子矩阵所有元素.算法实现的思路是怎么样的? 解决方案 http://blog.sina.com.cn/s/blog_a46817ff01013xgw.html 解决方案二: http://blog.csdn.net/beiyeqingteng/article/details/7056687 解决方案三: 给一种思路,把子矩阵看着一个滑动的窗口,进行遍历,计算和的时候计算滑动出

C语言中实现KMP算法的实例讲解_C 语言

一般的算法为什么这么低效呢?那是因为主串指针回溯情况过多: 主串指针如果不回溯的话,速度就会加快,那我们就会想: 如何让主串指针不回溯? KMP算法就是解决了这个问题,所以速度变得更快速了. 它是这样子的: 用一个数组:next[] 求得失配时的位置,然后保存下来. 要说清楚KMP算法,可以从朴素的模式匹配算法说起.  朴素的模式匹配算法比较容易理解,其实现如下    int Index(char s[], char p[], int pos) { int i, j, slen, plen; i

贪心算法的理解与实例应用

问题描述 贪心算法的理解与实例应用 对贪心算法的深刻理解,以及贪心算法的经典应用,对相应的实例进行分析 解决方案 哈夫曼树-贪心算法的应用实例strtotime 深入理解应用实例---------------------- 解决方案二: 可参考 http://blog.csdn.net/effective_coder/article/details/8736718

c语言-关于C语言无符号规格化的一个理解

问题描述 关于C语言无符号规格化的一个理解 看深入理解计算机系统里面.关于规格化的一段描述:......也就是说,指数的值是E=e-Bias其中e是无符号数,其位表示为ek-1···e1e0而Bias是一个等于2k-1 -1(单精度是127,双精度是1023)的偏置值..... 我知道C语言单精度的指数位是8位,取值范围是-126到127.但是我对E=e-Bias不理解.这里的e代表的是什么?本人小白求解释.. 解决方案 e就是你的指数值,给个例子 0100 0010 1**111 0110 0

关于c语言实现队列的算法,总会出现内存方面错误,求高人指明错误

问题描述 关于c语言实现队列的算法,总会出现内存方面错误,求高人指明错误 //实现一个队列,任意输入一串字符,以999为结束标志,然后打出队列中的数据 //定义队列 typedef struct QNode { int data; QNode *next; }QNode,*QueuePtr; typedef struct { QueuePtr front; QueuePtr rear; }LinkQuede; //初始化一个链队 void initQueue(LinkQuede *p) { p-