zoukankan      html  css  js  c++  java
  • 蓝桥杯 格子问题:输出同行同列同对角线格子的位置

    来源: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;
    }

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

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

  • 相关阅读:
    使用 git 托管代码
    转载自网络大神
    i18n 国际化
    转自知乎大神---什么是 JS 原型链?
    转自知乎大神----JS 闭包是什么
    转自知乎大神----JS 的 new 到底是干什么的?
    转载自知乎大神---this 的值到底是什么?一次说清楚
    sql查看本机IP地址
    Python 编码规范(Google)
    Python在mysql中进行操作是十分容易和简洁的
  • 原文地址:https://www.cnblogs.com/yangnansuper/p/10111814.html
Copyright © 2011-2022 走看看