二维数组的本质上仍然为一段连续的线性空间,和一维数组相同,根据下标进行访问时,仍然是常数时间。
有些看似是二维的形式,其实稍作思考,还是一维的,只是为了展示的方便,
- 比如 4*4 的 16 个时钟,它们各自指向不同的时刻,我们的工作是让其做到时钟同步,因此一个一维数组(向量,
vector<int> clocks;
),轻松解决问题;
- 比如 4*4 的 16 个时钟,它们各自指向不同的时刻,我们的工作是让其做到时钟同步,因此一个一维数组(向量,
二维的二值图像显然需要使用二维数组进行存储;
0. 基础
- 二维数组,可以用来刻画图中结点和边的关系,也即图的邻接矩阵法;
二维布尔数组(值只取 0/1),用来刻画结点之间是否存在某种定性的关系;
bool areFriends[10][10]; // 10 人之间的朋友关系,显然是对称的
旅行商问题:两城市间的距离
double dist[MAX][MAX];
1. 高级
4*4 一共 16 个时钟,时钟上的时间各不相同,现在要通过操做 10 个开关,使其时间一致。已知,开关对时钟的控制关系如下:
- 0:0、1、2;
- 1:3、7、9、11
- 2:4、10、14、15;
- 3:0、4、5、6、7
- 4:6、7、8、10、12;
- 5:0、2、14、15
- 6:3、14、15;
- 7:4、5、7、14、15
- 8:1、2、3、4、5;
- 9:3、4、5、9、13
也即此时,开关对时钟的控制,长度也是不一的。但,时钟的数目是固定的,开关的数目也是固定的:
const int SWITCHES = 10, CLOCKS = 16;
const char linked[SWITCHES][CLOCKS] = {
"xxx.............",
"...x...x.x.x.....",
....
"...xxx...x...x.."
}
// 当然也可以使用 0/1 存储为布尔类型