试题描述
10 11 12 13
9
2
1
求蛇形阵中数字n在几行几列。
输入描述
多组数据:每组一个n(<=max int)。
输出描述
输出每一组数据的结果(横坐标、纵坐标);
输入样例
8
20
25
0
输出样例
2 3
5 4
1 5
上来一看,纯模拟,啥也不想,先模拟试下,10分钟敲完代码,调试了10-15分钟(基础功还是不行- -)
我是没用数组写的,果断TLE了- -
01 #include
02 using namespace std;
03 int main()
04 {
05 while (1)
06 {
07 int n;
08 cin>>n;
09 if (!n) return 0;
10 int i,j,k,t,f=0;
11 k=1;
12 i=1;
13 j=1;
14 t=1;
15 while (1)
16 {
17 ++i;
18 ++k;//a[++i][j]=++k
19 if (!f&&k==n)
20 {
21 cout<<j<<" "<<i<<endl;
22 f=1;
23 }
24 if (!f)
25 for (int s=1;s<=t;s++)
26 {
27 ++j;
28 ++k;//a[i][++j]=++k;下同
29 if (k==n)
30 {
31 cout<<j<<" "<<i<<endl;
32 f=1;
33 }
34 }
35 if (!f)for (int s=1;s<=t;s++)
36 {
37 --i;
38 ++k;//a[i][++j]=++k;下同
39 if (k==n)
40 {
41 cout<<j<<" "<<i<<endl;
42 f=1;
43 }
44 }
45 t++;
46 ++j;
47 ++k;
48 if (!f)if (k==n)
49 {
50 cout<<j<<" "<<i<<endl;
51 f=1;
52 }
53 if (!f)for (int s=1;s<=t;s++)
54 {
55 ++i;
56 ++k;
57 if (k==n)
58 {
59 cout<<j<<" "<<i<<endl;
60 f=1;
61 }
62 }
63 if (!f)for (int s=1;s<=t;s++)
64 {
65 --j;
66 ++k;
67 if (k==n)
68 {
69 cout<<j<<" "<<i<<endl;
70 f=1;
71 }
72 }
73 t++;
74 if (f) break;
75 }
76 }
77 }
模拟果断不行,然后得从数学方面考虑了。观察到,每一层的元素个数成等差数列,t表示第几层,n表示t层的总元素个数。n=1+3+5+....+t-2+t=n^2。所求的数x分t的奇偶性讨论,再与t层右上角的中间元素(n-t+1)想比较,从而确定x实际位置。
10分钟解决,一个小粗心,贡献了一次WA.T T
01 #include
02 #include
03 using namespace std;
04 int main()
05 {
06 int x;
07 while (1){
08 cin>>x;
09 if (!x) return 0;
10 int t,n,s,i,j,k;
11 for (t=sqrt(x);;t++)
12 if ((t*t)>=x) break;
13 n=t*t;
14 k=n-t+1;
15 i=j=t;
16 if (t%2==0){
17 if (x>=k) i=i-(x-k);
18 if (x<</SPAN>k) j=j-(k-x);
19 }
20 if (t%2) {
21 if (x>=k) j-=x-k;
22 if (x<</SPAN>k) i-=k-x;
23 }
24 cout<<j<<" "<<i<<endl;
25 }
26 }