D

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
",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
",i,j);
                    printf("%d %d
",x1,y1);
                }
                else
                    printf("%d %d
",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
",j,m);
                printf("%d %d
",i,j);
                printf("%d %d
",x1,y1);
            }
        }
    }

}
原文地址:https://www.cnblogs.com/dongdong25800/p/11087805.html