• 蓝桥杯 格子问题:输出同行同列同对角线格子的位置


    来源:NOIP全国联赛普及组1995年

    首先我看了这道题,很老实得做了一遍,画出一个奇数的格子,一个偶数的格子,分别得出结论。

    主对角线上两数之差相等,副对角线上两数之和相等。结果如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include<math.h>
    int main()
    {
    int n,i,j;
    int m,z,d;
    while(scanf("%d%d%d",&n,&i,&j)==3)//表示可以循环接收三个数。
    {
    for(m=1;m<=n;m++)
    {
    printf("(%d,%d)",i,m);//输出一行
    }
    printf(" ");
    for(z=1;z<=n;z++)
    {
    printf("(%d,%d)",z,j);//输出一列
    }
    printf(" ");
    d=fabs(i-j);
    if(i==j)//输出左上到右下,如果i=j,则输出整个主对角线上的坐标
    {
    for(m=1,z=1;m<=n;m++,z++)
    printf("(%d,%d)",m,z);
    }
    else if(i<j)
    { //如果i<j,则输出开头以1为行的坐标,到列坐标以n结束,应注意顺序
    for(m=1,z=m+d;z<=n;m++,z++)
    {
    printf("(%d,%d)",m,z);
    }
    }
    else{ //如果i>j,则输出开头以1为列的坐标,到行坐标以n结束。应注意顺序
    for(z=1,m=z+d;m<=n;m++,z++)
    printf("(%d,%d)",m,z);
    }
    printf(" ");
    if(i+j==n+1)//输出左下到右上,如果i+j=n+1,则说明为副对角线上的坐标。输出整个副对角线上的坐标
    {
    for(m=n,z=1;m>=1;m--,z++)
    {
    printf("(%d,%d)",m,z);
    }
    }
    else {
    if(i<j)//分三种情况讨论。将较大的设为行坐标,较小的设为纵坐标进行输出。如果两个数相等,则根据副对角线上
    //两数之和相等来进行输出。注意顺序
    for(m=j,z=i;m>=1&&z<=n;m--,z++)
    {
    printf("(%d,%d)",m,z);
    }
    else {if(i>j)
    for(m=i,z=j;m>=1&&z<=n;m--,z++)
    {
    printf("(%d,%d)",m,z);
    }
    else
    for(m=i+j-1,z=1;m>=1&&z<=n;m--,z++)
    printf("(%d,%d)",m,z);
    printf(" ");
    }

    }
    }
    return 0;
    }

    经过多次调试,我终于算是成功了。 

    结果上网一搜,获得结果如下:

    #include<stdio.h>
    int main()
    {
    int n,x,y;
    scanf("%d%d%d",&n,&x,&y);
    int i,x0,y0;
    for(i=1;i<=n;i++)
    {
    printf("(%d,%d)",i,y);//输出一行
    }
    printf(" ");

    for(i=1;i<n;i++)
    {
    printf("(%d,%d)",x,i);//输出一列
    }
    printf(" ");
    x0=x;//将x,y 复制
    y0=y;
    while(x!=1&&y!=1)
    {
    x--;
    y--;
    }//将坐标减至开始输出的第一个坐标
    while(x<=n&&y<=n)
    {
    printf("(%d,%d)",x++,y++);//输出主对角线上的坐标
    }
    printf(" ");
    while(x0!=n&&y0!=1)
    {
    x0++;
    y0--;
    }//将坐标减至开始输出的第一个坐标
    while(x0>=1&&y0<=n)
    {
    printf("(%d,%d)",x0--,y0++);//输出副对角线上的坐标
    }
    return 0;
    }

    。。。。。。这也太简单了,力荐!

    同时要反思自己冗余的思想。

  • 相关阅读:
    c++ isdigit函数
    c++ swap函数
    1.2Hello, World!的大小
    1.2整型与布尔型的转换
    1.2打印ASCII码
    leetcode[170]Two Sum III
    leetcode[167]Two Sum II
    leetcode[1]Two Sum
    leetcode[2]Add Two Numbers
    leetcode[3]Longest Substring Without Repeating Characters
  • 原文地址:https://www.cnblogs.com/yangnansuper/p/10111814.html
Copyright © 2020-2023  润新知