zoukankan      html  css  js  c++  java
  • 同行列对角线的格子

    传送门: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("
    ");
    10     
    11     for(x=1;x<=n;x++) printf("(%d,%d) ",x,j);//输出第j列
    12     printf("
    ");
    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("
    ");
    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("
    ");
     9     
    10     for(x=1;x<=N;x++) printf("(%d,%d) ",x,j);
    11     printf("
    ");
    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("
    ");
    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("
    ");
    24     return 0;
    25 }
    View Code
  • 相关阅读:
    【JavaP6大纲】SpringCould篇:什么是微服务
    【JavaP6大纲】SpringCould篇: Spring Boot 和 Spring Cloud,谈谈你对它们的理解?
    【JavaP6大纲】分布式会话篇:集群部署时的分布式 Session 如何实现?
    【JavaP6大纲】SpringCould篇:Spring Cloud 和 Dubbo 有哪些区别?
    【JavaP6大纲】SpringCould篇:服务发现组件 Eureka 的主要调用过程?Eureka 和 Zookeeper 都可以提供服务注册与发现的功能,它们有什么区别?
    【JavaP6大纲】SpringCould篇:熔断框架如何做技术选型?选用 Sentinel 还是 Hystrix?
    【JavaP6大纲】SpringCould篇:如何限流?在工作中是怎么做的?说一下具体的实现?
    【JavaP6大纲】SpringCould篇:常用组件底层实现
    【JavaP6大纲】MySQL篇:SQL的整个解析、执行过程原理、SQL行转列?
    如何将百度搜索嵌入到站点中!
  • 原文地址:https://www.cnblogs.com/huashanqingzhu/p/10036184.html
Copyright © 2011-2022 走看看