给定一个全为0/1的等边矩阵,对每一行进行移位找出行最大值(二级制数),返回矩阵所有行的和。
//5
//1, 0, 0, 0, 1
//0, 0, 0, 1, 1
//0, 1, 0, 1, 0
//1, 0, 0, 1, 1
//1, 0, 1, 0, 1
- //反转数组
- void reverseM(unsigned int * arr, int start,int end)
- {
- //int l = 0, r = len - 1;
- while (start
- {
- unsigned char tmp = arr[start];
- arr[start] = arr[end];
- arr[end] = tmp;
- ++start;
- --end;
- }
-
- }
-
-
- unsigned int FindMax(unsigned int**arr, int len)
- {
- unsigned int max = 0;
- unsigned int rowvalue = 0;
- unsigned int maxrowvalue = 0;
- for (int i = 0; i < len; i++)//遍历所有行
- {
- //对每一行进行移位操作,查找最大的行值,最多可以移len-1
- //从移1个位置开始到len-1次移位
- //移位完成后计算行值
- for (int j = 0; j < len; j++)
- {
-
- if (j != 0)//0不不需要移位可以直接计算行值
- {//三段反转数组可实现数组的移位操作
- reverseM(arr[i], 0,len-1); //反转整个数组
- reverseM(arr[i], 0,j); //反转前j位
- reverseM(arr[i], j,len-1); //反转剩余部分
- }
-
- //计算每一行的值
- for (int k = 0; k < len; k++)
- {//1 0 1 0 1
- rowvalue = rowvalue | (arr[i][k] << (len - k-1));
- }
- //寻找每行移位后的最大值
- if (maxrowvalue < rowvalue)
- {
- maxrowvalue = rowvalue;
- }
- }
-
- //每一行的值相加得到矩阵最终的和
- max += maxrowvalue;
- }
- return max;
- }