D - Tolik and His Uncle
题意:给个n*m的单元格,起始位置(1,1)每次可以自己造个(x,y)使位置变为(a+x,b+y),a,b为目前所在位置,现在要求每对x,y不能重复,要求遍历所有单元格,输出按顺序走的单元格的坐标。
思路:别被样例迷惑,可以发现对于一维来说,我们可以想到比如长度为5,初始在1,可以走1-5-2-4-3,x为4,-3,2,-1,不会产生重复,
对于一维来说就是每次走与它中间对称的一个点,然后再走下一个。推广到二维就是每次走关于中心对称的点..
注意ceil()返回浮点,需要强转int,且int/int时前面需要加(double)或*1.0
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1; i<=(int)ceil(1.0*n/2); i++)
{
if(i==(int)ceil(1.0*n/2)&&(n%2!=0))
{
// printf("??%d %d\n",i,i%2);
for(int j=1; j<=(int)ceil(1.0*m/2); j++)
{
int x1=n+1-i;
int y1=m+1-j;
if(x1!=i||y1!=j)
{
printf("%d %d\n",i,j);
printf("%d %d\n",x1,y1);
}
else
printf("%d %d\n",i,j);
}
}
else
{
for(int j=1; j<=m; j++)
{
int x1=n+1-i;
int y1=m+1-j;
// printf("??j=%d m=%d\n",j,m);
printf("%d %d\n",i,j);
printf("%d %d\n",x1,y1);
}
}
}
}