uva 10161

试题描述


10 11 12 13

   8   7  14

   3    15

   4   5  16


求蛇形阵中数字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 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值