确定了在第i圈后,怎么求出(x, y)是这圈的第几个数呢? 分两种情况讨论: ①(x, y)在整个矩阵的上半边/右半边,即这个数在这圈的上/右边的那行,就是第i圈的第(x + y - 2 * i + 1)个数。 ②否则,就是距离这圈的第1个数(x + y - 2 * i + 1)了。
代码实现
法1
#include<bits/stdc++.h>usingnamespace std;intmain(){int n, x, y;
cin >> n >> x >> y;int**a =newint*[n];for(int i =0; i < n;++i){
a[i]=newint[n];}int k =1;for(int i =0; i < n /2+1;++i){for(int j = i; j < n - i;++j){
a[i][j]= k++;}for(int j = i +1; j < n - i;++j){
a[j][n - i -1]= k++;}for(int j = n - i -2; j > i;--j){
a[n - i -1][j]= k++;}for(int j = n - i -1; j > i;--j){
a[j][i]= k++;}}
cout << a[x -1][y -1]<<'\n';return0;}
法2
#include<bits/stdc++.h>usingnamespace std;intmain(){int n, x, y;
cin >> n >> x >> y;int t =min(x,min(y,min(n - x +1, n - y +1)));if(x <= y){
cout << t *(4*(n -1)-4* t)+10* t -4* n -3+ x + y <<'\n';}else{
cout << t *(4* n -4* t)+2* t +1- x - y <<'\n';}return0;}