不还意思,让大家久等了。最近忙着刷题没空写心得。
今天我就这几天做题遇到的问题来说说。
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. 直到队列全部读完。
参考答案见末尾。
队列:涉及数据结构。
|
如:
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;
}