题目描述:
一个 n 行 n 列的蛇形矩阵可由如下方法生成:
从矩阵的左上角(第 1 行第 1 列)出发,初始时向右移动;如果前方是未曾经过的格子,则继续前进,否则右转;重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入 1, 2, 3, ... , n ^ 2,便构成了一个蛇形矩阵,其中 1 <= n <= 30000。现给出矩阵大小 n 以及 i 和 j,请你求出该矩阵中第 i 行第 j 列的数是多少?
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
输入描述:
输入共一行,包含三个整数 n, i, j,每两个整数之间用一个空格隔开,分别表示矩阵大小、待求的数所在的行号和列号。
输出描述:
输出共一行,包含一个整数,表示相应矩阵中第 i 行第 j 列的数。
样例输入:
4 2 3
样例输出:
14
思想:
#include <iostream>
using namespace std;
int main() {
int n,p,q;
while(cin>>n>>p>>q){
int a=n,b=n,c=1,d=1,xx=1,yy=1,sum=1;
if(n%2==1&&(n+1)/2==p&&(n+1)/2==q)
sum=n*n;
else {
while(true) {
if(xx==p&&q>=yy&&q<a) {
sum+=(q-yy);
break;
} else {
sum+=(a-yy);
yy=a;
}
a--;
if(yy==q&&p>=xx&&p<b) {
sum+=(p-xx);
break;
} else {
sum+=(b-xx);
xx=b;
}
b--;
if(xx==p&&q<=yy&&q>c) {
sum+=(yy-q);
break;
} else {
sum+=(yy-c);
yy=c;
}
c++;
if(yy==q&&p<=xx&&p>d) {
sum+=(xx-p);
break;
} else {
sum+=(xx-d);
xx=d+1;
yy=c;
}
d++;
}
}
cout<<sum<<endl;
}
return 0;
}
升级版
1 #include <iostream> 2 using namespace std; 3 int main(){ 4 long n,i,j,p; 5 cin>>n>>i>>j; 6 long m=0,k,s,num=1; 7 long c[n][n]; 8 p=n/2; 9 s=n-1; 10 while(s>m){ 11 for(k=m;k<s;k++){ 12 c[m][k]=num; 13 num++; 14 } 15 for(k=m;k<s;k++){ 16 c[k][s]=num; 17 num++; 18 } 19 for(k=s;k>m;k--){ 20 c[s][k]=num; 21 num++; 22 } 23 for(k=s;k>m;k--){ 24 c[k][m]=num; 25 num++; 26 } 27 s--; 28 m++; 29 } 30 if(n%2!=0){ 31 c[p][p]=n*n; 32 } 33 cout<<c[i-1][j-1]; 34 return 0; 35 }