螺旋矩阵 noip2014普及组

螺旋矩阵 noip2014普及组

本题可以直接模拟填数字,也可以直接计算结果。

代码一:(这个代码,缺陷在于数组太大,浪费内存啊。另外,循环次数也不少。总之,时间空间的消耗都不小。)

 1 /*===============================================================
 2 本段代码是模拟往数组填数字的过程。
 3 每填写一个值就判断该位置是否(i,j)。若寻到目标位置,
 4 则输出答案。 
 5 =================================================================*/
 6 #include<stdio.h>
 7 int a[3001][3001]={0};//这个大小的静态数组尚可申请,但假如是放在函数内部声明却不行了的。这个大小大概是9MB,但距离30000*30000的大小实在是太远了。 
 8 int main()
 9 {
10     int n,i,j;
11     int m;//m表示总共的层数 
12     int k,p,q;//循环变量 
13     int flag=0;//标志性变量:等于0表示尚未循环到目标元素(i,j) 
14     int t;
15      int len;
16      
17     scanf("%d%d%d",&n,&i,&j);
18     m=(n+1)/2;  //m表示总共的层数 
19     t=1;        //t表示要填进数组的数字
20     for(k=1;k<=m&&flag==0;k++)
21     {
22         p=k,q=k;      //(k,k)是第k层左上角坐标点
23         len=n-2*(k-1);//表示当前层中每一条边的元素个数 
24         for(;q<=(k+len-1);q++)//填充当前层的顶边 
25         {
26             a[p][q]=t;
27             if(p==i&&q==j)
28             {
29                 printf("%d\n",a[p][q]);
30                 return 0;
31             }
32             t++;
33         }
34         q--;
35         p++;
36         for(;p<=(k+len-1);p++)//填充当前层的右边 
37         {
38             a[p][q]=t;
39             if(p==i&&q==j)
40             {
41                 printf("%d\n",a[p][q]);
42                 return 0;
43             }
44             t++;
45         }
46         p--;
47         q--;
48         for(;q>=k;q--)//填充当前层的下边
49         {
50             a[p][q]=t;
51             if(p==i&&q==j)
52             {
53                 printf("%d\n",a[p][q]);
54                 return 0;
55             }
56             t++;
57         }
58         q++;
59         p--;
60         for(;p>k;p--)//填充当前层的左边
61         {
62             a[p][q]=t;
63             if(p==i&&q==j)
64             {
65                 printf("%d\n",a[p][q]);
66                 return 0;
67             }
68             t++;
69         }
70     }
71     return 0;
72 }
View Code

相关文章: