1,稀疏数组
“二维数组”转“稀疏数组”实现思路:
1)遍历二维数组,得到有效数据个数sum
2)根据sum就可以创建稀疏数组sparseArray[sum+1,3]
3)将二维数组有效数据存到稀疏数组中
“稀疏数组”转“二维数组”实现思路:
1)读取稀疏数组第一行创建原始二维数组
2)从稀疏数组第二行开始读取数据到二维数组
C#实现代码:
1 using System; 2 3 namespace 数据结构 4 { 5 public class SparseArray 6 { 7 static void Main(string[] args) 8 { 9 #region 创建原始二维数组 10 //0表示没有棋子,1表示白棋,2表示黑棋 11 int row = 11; 12 int col = 11; 13 int[,] chessAarry1 = new int[row, col]; 14 chessAarry1[1, 2] = 1; 15 chessAarry1[2, 3] = 2; 16 chessAarry1[5, 6] = 1; 17 chessAarry1[3, 5] = 2; 18 19 //打印二维数组 20 Console.WriteLine("打印原始二维数组:"); 21 for (int r = 0; r < chessAarry1.GetLength(0); r++) 22 { 23 for (int i = 0; i < chessAarry1.GetLength(1); i++) 24 { 25 Console.Write($"{chessAarry1[r, i]}\t"); 26 } 27 Console.WriteLine(""); 28 } 29 #endregion 30 31 #region 创建稀疏数组 32 //(1)统计原始二维数组有效数据 33 int sum = 0; 34 foreach (var item in chessAarry1) 35 { 36 if (item > 0) sum++; 37 } 38 int[,] sparseArray = new int[sum + 1, 3]; 39 sparseArray[0, 0] = row; 40 sparseArray[0, 1] = col; 41 sparseArray[0, 2] = sum; 42 43 //(2)从原始二维数组读取有效数据到稀疏数组 44 int insert = 0; 45 for (int r = 0; r < chessAarry1.GetLength(0); r++) 46 { 47 for (int i = 0; i < chessAarry1.GetLength(1); i++) 48 { 49 var val = chessAarry1[r, i]; 50 if (val > 0) 51 { 52 insert++; 53 sparseArray[insert, 0] = r; 54 sparseArray[insert, 1] = i; 55 sparseArray[insert, 2] = val; 56 } 57 if (sum == insert) break; 58 } 59 if (sum == insert) break; 60 } 61 62 //打印稀疏数组 63 Console.WriteLine("打印稀疏数组:"); 64 for (int r = 0; r < sparseArray.GetLength(0); r++) 65 { 66 Console.WriteLine($"{sparseArray[r, 0]}\t{sparseArray[r, 1]}\t{sparseArray[r, 2]}"); 67 } 68 #endregion 69 70 #region 恢复原始二维数组 71 //(1)创建所有元素都为0的二维数组 72 int row2 = sparseArray[0, 0]; 73 int col2 = sparseArray[0, 1]; 74 int val2 = sparseArray[0, 2]; 75 int[,] chessAarry2 = new int[row2, col2]; 76 //(2)从稀疏数组读取有效数据到原始二维数组 77 for (int r = 1; r < sparseArray.GetLength(0); r++) 78 { 79 row2 = sparseArray[r, 0]; 80 col2 = sparseArray[r, 1]; 81 val2 = sparseArray[r, 2]; 82 chessAarry2[row2, col2] = val2; 83 } 84 85 //打印二维数组 86 Console.WriteLine("打印原始二维数组:"); 87 for (int r = 0; r < chessAarry2.GetLength(0); r++) 88 { 89 for (int i = 0; i < chessAarry2.GetLength(1); i++) 90 { 91 Console.Write($"{chessAarry2[r, i]}\t"); 92 } 93 Console.WriteLine(); 94 } 95 #endregion 96 } 97 } 98 }