#include#include#include#defineMAX_ROWS100#defineMAX_COLS100// 计算整数的绝对值intabs_val(int a){return a <0?-a : a;}intmain(){int rows, cols;int nums[MAX_ROWS][MAX_COLS];// 输入矩阵int result[MAX_ROWS][MAX_COLS];// 存储结果矩阵// Step 1: 读取矩阵的行数和列数scanf("%d",&rows);scanf("%d",&cols);// Step 2: 读取二维数组的每个元素for(int i =0; i < rows; i++){for(int j =0; j < cols; j++){scanf("%d",&nums[i][j]);// 填充输入矩阵}}// Step 3: 计算每个元素到相同值元素的最小曼哈顿距离for(int i =0; i < rows; i++){for(int j =0; j < cols; j++){int value = nums[i][j];// 当前元素的值int min_distance = INT_MAX;// 初始化最小距离为最大整数// Step 4: 查找与当前值相等的最近元素,遍历整个矩阵for(int x =0; x < rows; x++){for(int y =0; y < cols; y++){// 确保不是当前元素自己if((x != i || y != j)&& nums[x][y]== value){// 计算曼哈顿距离并更新最小距离int distance =abs_val(x - i)+abs_val(y - j);if(distance < min_distance){
min_distance = distance;}}}}// Step 5: 如果没有找到相同值元素,则设置为 -1,否则设置为最小距离
result[i][j]=(min_distance == INT_MAX)?-1: min_distance;}}// Step 6: 输出结果数组,按照指定格式输出printf("[");for(int i =0; i < rows; i++){printf("[");for(int j =0; j < cols; j++){printf("%d", result[i][j]);if(j < cols -1){printf(", ");}}printf("]");if(i < rows -1){printf(", ");}}printf("]\n");return0;}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
JS解法
解题思路
这个问题的目标是找到一个大于给定数字 n 的最小整数,使得这个整数与 n 有相同的1的个数,并且二进制表示方式相同。换句话说,我们需要找到下一个比 n 大的整数,使得它的二进制数中1的个数和 n 一样。
具体思路如下:
定义问题:
给定一个整数 n,我们希望通过调整它的二进制表示,找到下一个更大的数字,且新数字的1的个数与 n 相同。 主要步骤:
计算 n 的尾部零和1的数量: 通过右移运算,统计 n 从右侧开始连续的零(c0)和紧接其后的1的数量(c1)。这个过程可以通过连续地右移 n 直到不满足条件。 判断边界情况: 如果 c0 + c1 == 31 或者 c0 + c1 == 0,说明 n 是一个全1的数或全0的数,无法找到更大的数字,直接返回 -1。 找到最小的更大数字: 在 n 的二进制表示中,找到一个合适的位来进行调整,令其变得比 n 大,并且保持相同数量的1。 通过将 n 的某些位置的1变为0,再设置右侧最低的多个0为1来实现这一调整。 关键点:
评论记录:
回复评论: