来源: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;
}
。。。。。。这也太简单了,力荐!
同时要反思自己冗余的思想。