同行列对角线的格子

传送门:http://noi.openjudge.cn/ch0108/02/ 总时间限制: 1000ms 内存限制: 65536kB
描述

输入三个自然数N,i,j (1<=i<=N,1<=j<=N),输出在一个N*N格的棋盘中(行列均从1开始编号),与格子(i,j)同行、同列、同一对角线的所有格子的位置。

如:n=4,i=2,j=3表示了棋盘中的第二行第三列的格子,如下图:

当n=4,i=2,j=3时,输出的结果是:

(2,1) (2,2) (2,3) (2,4)                        同一行上格子的位置

(1,3) (2,3) (3,3) (4,3)                        同一列上格子的位置

(1,2) (2,3) (3,4)                              左上到右下对角线上的格子的位置

(4,1) (3,2) (2,3) (1,4)                        左下到右上对角线上的格子的位置

 

输入一行,三个自然数N,i,j,相邻两个数之间用单个空格隔开。1 <= N <= 10。输出四行:
第一行:从左到右输出同一行格子位置;
第二行:从上到下输出同一列格子位置;
第三行:从左上到右下输出同一对角线格子位置;
第四行:从左下到右上输出同一对角线格子位置。

其中每个格子位置用如下格式输出:(x,y),x为行号,y为列号,采用英文标点,中间无空格。
相邻两个格子位置之间用单个空格隔开。样例输入

4 2 3

样例输出

(2,1) (2,2) (2,3) (2,4)
(1,3) (2,3) (3,3) (4,3)
(1,2) (2,3) (3,4)
(4,1) (3,2) (2,3) (1,4)

来源NOIP1996复赛 普及组 第二题

 1 #include <stdio.h>
 2 int main(int argc, char *argv[])
 3 {
 4     int n,i,j,x,y;
 5     
 6     scanf("%d%d%d",&n,&i,&j);
 7     
 8     for(y=1;y<=n;y++) printf("(%d,%d) ",i,y);//输出第i行 
 9     printf("\n");
10     
11     for(x=1;x<=n;x++) printf("(%d,%d) ",x,j);//输出第j列
12     printf("\n");
13     
14     //从左上到右下的的斜线上的元素位置坐标的横、纵坐标只差保持不变。 
15     if(i<=j)//在矩阵的右上三角部分 
16     {
17         x=1;
18         y=(j-i)+x;
19         while(y<=n)
20         {
21             printf("(%d,%d) ",x,y);
22             x++; y++;
23         }
24     }
25     else//在矩阵的左下三角部分 
26     {
27         y=1;
28         x=(i-j)+y;
29         while(x<=n)
30         {
31             printf("(%d,%d) ",x,y);
32             x++; y++;
33         }
34     }
35     printf("\n");
36     
37     //从左下到右上的斜线上的元素横、纵坐标之和相等 
38     if(i+j>n)//在矩阵的右下三角部分
39     {
40         x=n;
41         y=i+j-x;
42         while(y<=n)
43         {
44             printf("(%d,%d) ",x,y);
45             x--; y++;
46         }
47     }
48     else//在矩阵的左上三角部分
49     {
50         y=1;
51         x=i+j-y;
52         while(x>=1)
53         {
54             printf("(%d,%d) ",x,y);
55             x--; y++;
56         }
57     } 
58     return 0;
59 }
代码一

 另一种思路:

 

同一行和同一列就不说了,下面说说两条对角线方向的处理。如图所示,假设输入的点(i,j)是黄色点。首先根据黄色点坐标(i,j)计算出蓝色点坐标(x,y),再从蓝色点遍历该条斜线方向的所有单元格。

左上到右下的斜线方向:观察发现从(i,j)到(x,y)过程中,每走一步都会使得行和列坐标减1。蓝色块应该就是在棋盘的边界,蓝色块的行和列必然有一个是1.所以从黄色块到蓝色块的步数是min(i,j)。故可以根据(i,j)计算出(x,y),如下:

min=MIN(i,j)

x=i-min+1

y=j-min+1

 

同理,从左下到右上的斜线方向:从黄块(i,j)到蓝块(x,y)的过程中,行坐标每次加1,列坐标每次减1.蓝块必然是处于棋盘边缘处,故从黄块到蓝块的步数是

min=MIN(n-i,j-1)

所以x=i+min,y=j-min

所以代码如下: 

 1 #include <stdio.h>
 2 int main()
 3 {
 4     int N,i,j,x,y,min;    
 5     scanf("%d%d%d",&N,&i,&j);    
 6     
 7     for(y=1;y<=N;y++) printf("(%d,%d) ",i,y);
 8     printf("\n");
 9     
10     for(x=1;x<=N;x++) printf("(%d,%d) ",x,j);
11     printf("\n");
12     
13     min=(i<j?i:j);
14     x=i-min+1;
15     y=j-min+1;
16     for( ; x<=N&&y<=N; x++,y++) printf("(%d,%d) ",x,y);
17     printf("\n");
18     
19     min=(  (N-i)<(j-1)  ?  (N-i)  :  (j-1) );
20     x=i+min;
21     y=j-min;
22     for( ; x>=1&&y<=N; x--,y++) printf("(%d,%d) ",x,y);
23     printf("\n");
24     return 0;
25 }
View Code

 

转载于:https://www.cnblogs.com/huashanqingzhu/p/10036184.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值