藍橋杯 格子問題:輸出同行同列同對角線格子的位置
來源: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;
}
。。。。。。這也太簡單了,力薦!
同時要反思自己冗餘的思想。