数据结构 第10讲 好玩贪吃蛇——数字矩阵

 数据结构 第10讲 好玩贪吃蛇——数字矩阵

上题目:

这是螺旋状的分布啊,有点像棒棒糖上面的圆圈圈。那么怎么解呢?

一种思路:先填外围一圈,然后把内部看作一个子问题,继续填充。

即前面的4*n-4个元素顺时针填充外围,

剩下的问题变成用后面的元素填充一个规模为n-2的子问题。

再用剩余元素的前面4*(n-2)-4个元素顺时针填充规模为n-2的子问题外围,

剩下的问题变成用后面的元素填充一个规模为n-4的更小的子问题

……

依次类推。

当n=1时填唯一的一个数即可。

换一种思路:把放出一个好玩的贪吃蛇,按照右下左上的顺序吃蛋糕,一边吃蛋糕,一边拉数字,多吃一个蛋糕,拉出的数字多1,直到把所有的蛋糕吃完。

当贪吃蛇把小蛋糕吃完的时候,画风就变成了这样:

那么程序设计怎么做呢?

因为贪吃蛇出动按照右下左上四个方向,因此先定义一个方向偏移数组:

向右:行+0,列+1;偏移量:DIR[0].x=0; DIR[0].y=1;

向下:行+1,列+0;偏移量:DIR[1].x=1; DIR[1].y=0;

向左:行+0,列-1;偏移量:DIR[2].x=0; DIR[2].y=-1;

向上:行-1,列+0;偏移量:DIR[3].x=-1; DIR[3].y=0;

定义了偏移数组后,就可以从左上角开始,先向右走,只要有蛋糕或未到边界就继续前进,否则选择下一个方向,一直走下去,直到拉出的数字达到最大值n2,算法停止。

那么你怎么知道有没有蛋糕呢?

因为吃了蛋糕后,这个方格就变成了一个大于零的数字,因此我们可以设置为0时有蛋糕。

那么你怎么知道有没有到达边界呢?

四周封锁:

做了封锁之后,小贪吃蛇再也不用担心跑出边界了,它只需要按照右下左上的方向,只吃有蛋糕的格子(为0)就可以了。

源码:

[cpp]view plaincopy

#include 

#include 

usingnamespacestd;

typedefstruct

{

intx;

inty;

} Position;//位置

intm[30][30];//地图

Position here,next;//当前位置,下一个位置

Position DIR[4]={0, 1, 1, 0, 0, -1, -1, 0};//右下左上方向数组

voidInit(intn)

{

for(inti=1; i<=n; i++)

{

for(intj=1; j<=n; j++)//方格阵列初始化为0

m[i][j]=0;

}

for(intj=0; j<=n+1; j++)//方格阵列上下围墙

m[0][j]=m[n+1][j]=-1;

for(inti=0; i<=n+1; i++)//方格阵列左右围墙

m[i][0]=m[i][n+1]=-1;

}

voidPrint(intstart,intendi)//start, endi为开始和结束下标

{

for(inti=start; i<=endi; i++)

{

cout<

for(intj=start+1; j<=endi; j++)

{

cout<<"\t"<

}

cout<

}

cout<

}

// n:原问题规模

// m:地图矩阵

voidSolve(intn)

{

here.x=1;//左上角有蛋糕的位置

here.y=1;

intdirIndex=0;

intnum=1;

m[1][1]=1;

while(num

{

next.x=here.x+DIR[dirIndex].x;

next.y=here.y+DIR[dirIndex].y;

if(m[next.x][next.y]==0)//判断下一个位置是否有蛋糕

{

m[next.x][next.y]=++num;//吃了蛋糕,拉出的数字加1

here=next;//以next为当前位置,继续走

}

else

dirIndex=(dirIndex+1)%4;//换下一个方向,按右下左上顺序继续吃蛋糕

}

}

intmain()

{

intn=0;

cout<<"请输入大于1小于等于20的整数n:"<

cin>>n;

while(n<1||n>20)

{

cout<<"请输入大于1小于等于20的整数n:"<

cin>>n;

}

Init(n);

Print(0,n+1);

Solve(n);

Print(1,n);

return0;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。博客原文地址http://blog.csdn.net/rainchxy/article/details/78296777

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,723评论 0 33
  • 面粉爱上了馅 要么成了包子 要么成了饼子 要么成了饺子 要么成了生煎 。 。 。 总之,好饿
    茶渔阅读 438评论 0 50
  • 当慢慢静下来的夜时,我的心此时也异常的静。不知为何我放下还没去完成的工作报表,却得闲来写一些让人感觉我是在突出自己...
    慧行天下阅读 160评论 0 1
  • 作为一个完成的应用程序,数据存储操作是必不可少的。因此,Android系统一共提供了四种数据存储方式。分别是:Sh...
    AiPuff阅读 542评论 0 0
  • 读之前除了知道它获得雨果奖以外什么都不知道,所以一直以为它是和三体一样厚重的书,所以在读到老刀回到他的第三空间时,...
    蒲公英不难过阅读 243评论 0 0