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

来源: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("\n");
for(z=1;z<=n;z++)
{
printf("(%d,%d)",z,j);//输出一列
}
printf("\n");
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("\n");
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("\n");
}

}
}
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("\n");

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

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

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

转载于:https://www.cnblogs.com/yangnansuper/p/10111814.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值