VC++学习心得(九)

不还意思,让大家久等了。最近忙着刷题没空写心得。

今天我就这几天做题遇到的问题来说说。

 

1.      数组

数组就像一个柜子有很多个格子,每个格子可以存储一个值。

关于数组,分为很多种。有字符串数组,整数数组等等。

数组的声明:

Char a[100];

表示申请最多可含101个字符的字符数组。

注意a[100]是指从a[0]到a[100]所以又101个空位。

相似的:

String a[100];

Int a[100];

以上这些是一维数组(即类似一条线)

 

所谓二维数组就像一个平面(有X,Y轴)

声明:  int a[100][100];表示申请一个长101,宽101的平面,平面内每一个坐标都可以存储一个数值。即有101*101=10201个空位可用。

 

还有三维数组就立体了,像一个立方体或长方体。

声明  Int a[100][100][100];这个就是一个立方体,可用存储101*101*101=1030301个整数。

 

但要注意,数组的维数越大,其占空间也是成倍的增加。所以声明变量时,够用就可以,不要申请太多,避免浪费过多的内存。

 

注意:数组在使用时要注意,规范的做法是声明后要对数组进行一次初始化。

如:

 

memset(a, -1, sizeof(a));

对a[]全部进行赋值 -1。

 

 

如OJ上的题目

d061: 蛇形数字三角

内容:

输入行数,如3输出如下图形
4
2 5
1 3 6

 

输入说明:

输出说明:

输入样例:

3

输出样例

4

2 5

1 3 6

 

提示:

1.      利用二维数组

2.      可以从1看做坐标(1,1)开始

3.      先向上遍历,再向右遍历。

4.      每次遍历一个之前没有遍历的位置 且不超出范围,就把它压入队列。

5.      完成一次后再从队列拿出一个数,继续循环

6.      直到队列全部读完。

参考答案见末尾。

 

队列:涉及数据结构。

队列的定义及基本运算

1、定义
     队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表

       

  (1)允许删除的一端称为队头(Front)
  (2)允许插入的一端称为队尾(Rear)
  (3)当队列中没有元素时称为空队列
  (4)队列亦称作先进先出(First In First Out)的线性表,简称为FIFO表
     队列的修改是依先进先出的原则进行的。新来的成员总是加入队尾(即不允许"加塞"),每次离开的成员总是队列头上的(不允许中途离队),即当前"最老的"成员离队。
 【例】在队列中依次加入元素a1,a2,…,an之后,a1是队头元素,an是队尾元素。退出队列的次序只能是a1,a2,…,an

2、队列的基本逻辑运算(注意:仅作参考,C++不是这样定义的)
(1)InitQueue(Q)
     置空队。构造一个空队列Q。

(2)QueueEmpty(Q)
     判队空。若队列Q为空,则返回真值,否则返回假值。

(3) QueueFull(Q)
     判队满。若队列Q为满,则返回真值,否则返回假值。
  注意:
     此操作只适用于队列的顺序存储结构。

(4) EnQueue(Q,x)
     若队列Q非满,则将元素x插入Q的队尾。此操作简称入队

(5) DeQueue(Q)
     若队列Q非空,则删去Q的队头元素,并返回该元素。此操作简称出队

(6) QueueFront(Q)
     若队列Q非空,则返回队头元素,但不改变队列Q的状态。

 

如:

Int dl[100];//队列

memset(dl,-1,sizeof(dl))//初始化

 

//读入数据:

dm++;

dl[dm]=xxx;

 

zz=0;//指针

dm=100;//队末

while (zz<=dm)

{

    输出dl[dm];

    zz++;

}

 

 

 

 

 

 

参考答案:

#include<iostream>

using namespace std;

 

 

int main()

{

  int n,dqs, sys,shu,x,y;

  int a[20][20],dl[2000][2];

 

  memset(a, -1, sizeof(a));

  memset(dl, -1, sizeof(dl));

 

  cin>>n;

  a[1][1]=1;//平面:用于存储数字

  shu=2;//下一个要输出的数字

  dqs=1;//要读的队列序号,即指针

  sys=2;//剩余数,即队列剩余未读的数量

  dl[1][1]=1;//dl [(序号)] [(1存储x坐标)(2存储y坐标)即要遍历的地址]

  dl[1][2]=2;

  dl[2][1]=2;

  dl[2][2]=1;

  while (sys>=dqs)//在完全读完队列前循环

   {

          x=dl[dqs][1];

          y=dl[dqs][2];

          if (a[x][y]<0)

         {

            a[x][y]=shu;

            shu++;

            if(((y+1)<=(n-x+1))&&(a[x][y+1]<0))

            {//不超出范围      //还未被赋值过

                      sys++;

                      dl[sys][1]=x;

                      dl[sys][2]=y+1;

             }

            if (((x+1)<=(n-y+1))&&(a[x+1][y]<0))

            {//不超出范围      //还未被赋值过

                      sys++;

                      dl[sys][1]=x+1;

                      dl[sys][2]=y;

             }

          }

          dqs++;//指针移向下一个

   }

  for (y=n;y>=1;y--)//输出

   {

            for (x=1;x<=n;x++)

            {

                      if (a[x][y]>0) cout<<a[x][y];

                      if (x<n) cout<<" ";

            }

            cout<<endl;

   }

  return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值