本题可以直接模拟填数字,也可以直接计算结果。
代码一:(这个代码,缺陷在于数组太大,浪费内存啊。另外,循环次数也不少。总之,时间空间的消耗都不小。)
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 }