GitHub

蛇形矩阵(一圈一圈)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 }

 

posted @ 2019-06-22 20:17  繁华似锦觅安宁  阅读(495)  评论(1编辑  收藏  举报