题目:
输入w m n三个数,w是矩阵宽度,m和n分别为矩阵里面的两个数;
输出值为两个数之间的距离(不能走直线)
矩阵按舌形排列
例如:
输入 w 为 6 m 为 2 n 为 8 则矩阵为:
1 2 3 4 5 6
12 11 10 9 8 7
13 14 15 16 17 18
24 23 22 21 20 19
那么 8 和 2 之间的距离为 4
解题思路:
先分别求出两个点的坐标,用坐标相减取绝对值再相加,即为两个点的距离
求坐标时,要考虑到蛇形排列中偶数行倒序排列的特殊情况
#include <stdio.h> int main() { int w = 0; //宽度 int val = 0; //输入数值 int val_1 = 0; //输入数值2 scanf("%d %d %d", &w, &val,&val_1); int x = 0, y = 0;//横纵坐标 y = ((val - 1) / w) + 1; //该值所在纵坐标(第几行) if (y % 2 == 1) //如果该行为奇数行 { x = val - (y - 1)*w; } else //如果为偶数行 { x = val - (y - 1)*w; x = w - x + 1; } printf("第一个数的坐标为:(%d,%d) ", x, y); int xx = 0, yy = 0; yy = ((val_1 - 1) / w) + 1; //该值所在纵坐标(第几行) if (yy % 2 == 1) //如果该行为奇数行 { xx = val_1 - (yy - 1)*w; } else //如果为偶数行 { xx = val_1 - (yy - 1)*w; xx = w - xx + 1; } printf("第二个数的坐标为:(%d,%d) ", xx, yy); int sum = 0, sunm = 0, s = 0; sum = (xx - x); if (sum < 0){ sum = -sum; } sunm = (yy - y); if (sunm < 0){ sunm = -sunm; } s = sum + sunm; printf("两个数之间的距离为:%d ", s); return 0; }
第二种方法:声明一个数组,按照该方法全部填充进去,再利用查找方法找到该值对应的下标得到距离
#include <stdio.h> int main() { int a[100][100] = { NULL }; int w, m, n; scanf("%d %d %d", &w, &m, &n); int k = 1; for (int i = 0; i < 100;i++) { if (((i+1) % 2) != 0) { for (int j = 0; j < w; j++) { a[i][j] = k; k++; } } else { for (int j = w-1; j >= 0; j--) { a[i][j] = k; k++; } } } for (int i = 0; i < 10;i++) { for (int j = 0; j < w; j++) { printf("%d ", a[i][j]); } printf(" "); } int x, y; for (int i = 0; i < 100; i++) { for (int j = 0; j < w; j++) { if (a[i][j]==m) { x=i+1; y=j+1; break; } } } int xx, yy; for (int i = 0; i < 100; i++) { for (int j = 0; j < w; j++) { if (a[i][j] == n) { xx=i+1; yy=j+1; break; } } } int sum = 0, sunm = 0, s = 0; sum = (xx - x); if (sum < 0){ sum = -sum; } sunm = (yy - y); if (sunm < 0){ sunm = -sunm; } s = sum + sunm; printf("两个数之间的距离为:%d ", s); return 0; }