重新整理数据结构与算法——稀疏数组[二]
前言
因为c# 算法与数据结构的非常少,大概81篇,特此整理一份,希望能帮助到初学者。
正文
有一句话说,世界上没有稀疏数组,然后呢,人定义出来了就有了。
也就是说稀疏数组是人们根据某种结构来定义这个数组有更多的含义。
职业盗图:
在一个11*11的数组中,只有几个是特殊的,其他都为0,那么自己就可以自己设计一些格式来表达这个棋盘的含义。
那么如何将这个棋盘转换成稀疏数组?
其中的一种定义是这样的:
有一个3维数组:
数组的第一行是特殊含义:
如下:
- 第一行第一列:二维数组的X轴的行数
- 第一行第二列:二位数组y轴的行数
- 第一行第三列:有多少个特殊数据
除了第一行,其他行表示的数据:第一列表示X 轴的坐标,第二列表示y轴坐标、第三列表示值。
职业盗图:
下面按照下面的思路,写一份code:
代码
首先设置一个棋盘:
static void Main(string[] args)
{
//初始化一个11*11的数组
int[,] map = new int[11,11];
map[1,2] = 1;
map[2,3] = 2;
for (int i = 0; i < 11; i++)
{
for (int j = 0; j < 11; j++)
{
Console.Write(map[i,j]+" ");
}
Console.WriteLine();
}
Console.ReadKey();
}
完整版:
static void Main(string[] args)
{
//初始化一个11*11的数组
int[,] map = new int[11,11];
map[1,2] = 1;
map[2,3] = 2;
int count = 0;
//打印棋盘
for (int i = 0; i < 11; i++)
{
for (int j = 0; j < 11; j++)
{
if (map[i, j]!=0)
{
count++;
}
Console.Write(map[i,j]+" ");
}
Console.WriteLine();
}
//转换为稀疏数组
//1.得到有多少个值count
int[,] shrinkMap = new int[count + 1, 3];
//赋值稀疏数组
shrinkMap[0, 0] = 11;
shrinkMap[0, 1] = 11;
shrinkMap[0, 2] = count;
//当前第几行
int curLine = 0;
//赋值稀疏数组
for (int i = 0; i < 11; i++)
{
for (int j = 0; j < 11; j++)
{
if (map[i, j] != 0)
{
curLine++;
shrinkMap[curLine, 0] = i;
shrinkMap[curLine, 1] = j;
shrinkMap[curLine, 2] = map[i, j];
}
}
}
//打印稀疏数组
Console.WriteLine("开始打印稀疏数组");
for (int i = 0; i < count+1; i++)
{
for (int j = 0; j < 3; j++)
{
Console.Write(shrinkMap[i, j] + " ");
}
Console.WriteLine();
}
// 稀疏数组还原
int[,] map2 = new int[11,11];
for (int i = 1; i < count + 1; i++)
{
for (int j = 0; j < 3; j++)
{
map2[shrinkMap[i, 0], shrinkMap[i, 1]] = shrinkMap[i, 2];
}
}
//打印map2
Console.WriteLine("开始打印还原后的棋盘");
for (int i = 0; i < 11; i++)
{
for (int j = 0; j < 11; j++)
{
if (map2[i, j] != 0)
{
count++;
}
Console.Write(map2[i, j] + " ");
}
Console.WriteLine();
}
Console.ReadKey();
}