蛇形矩阵(一圈一圈)1412
题目描述:
一个 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 }
转载请标明出处