| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 609 人关注过本帖
标题:请大家来帮我理解下这个题意
只看楼主 加入收藏
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 10楼 voidx
对 l 是要 + 1,因为插入了一张鬼。

[ 本帖最后由 lz1091914999 于 2011-8-6 22:24 编辑 ]

My life is brilliant
2011-08-06 21:44
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
程序代码:
#include <stdio.h>
#define add(y, n, L) ((y) + (n) > (L) ? ((y) + (n)) - (L) : (y) + (n))
#define sub(x, m, L) ((x) - (m) < (1) ? ((x) - (m)) + (L) : (x) - (m))

int main(void) {
    int x, y, m, n, L, t, kx, ky;

    scanf("%d%d%d%d%d", &x, &y, &m, &n, &L);
    if(x == y || !x || !y)
        return 0;
    for(t = 0, kx = x, ky = y; kx != ky ; t++) {
        kx = sub(kx, m, L + 1);
        ky = add(ky, n, L + 1);
    }

    printf("%d %d\n", t, kx); // printf("%d %d\n", t, ky);
    return 0;
}

这个是用迭代方式解的,可是怎么判断impossible呢?

My life is brilliant
2011-08-06 22:28
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
程序代码:
#include <stdio.h>

int main(void) {
    int x, y, m, n, L, t, kx, ky;

    scanf("%d%d%d%d%d", &x, &y, &m, &n, &L);
    if(x == y || x < 1 || y < 1 || x > L + 1 || y > L + 1)
        return 0;
    for(t = 0, kx = x, ky = y; kx != ky ; t++) {
        kx = kx - m < 1 ? kx - m + (L + 1) : kx - m;
        ky = (ky + n) % (L + 1);
        printf("%d %d\n", kx, ky);
    }

    printf("%d %d\n", t, kx); // printf("%d %d\n", t, ky);
    return 0;
}

My life is brilliant
2011-08-06 22:52
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
回复 13楼 lz1091914999
判断 impossible 的一个简单的方法是 记录初始状态,如果某次迭代后与初始状态相同,则 impossible。
2011-08-06 23:04
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
程序代码:
#include <stdio.h>

int main(int argc, char* argv[]) {
    int x, y, m, n, l;
    int a, b, k, t;
    
    while (scanf("%d %d %d %d %d", &x, &y, &m, &n, &l) == 5) {
        l++;
        m = l - m;
        a = x - y;
        b = m - n;
    
        if (b < 0) {
            a = -a;
            b = -b;
        }

        if (b == 0) {
            printf("Impossible\n");
            continue;
        }
        
        for (k = (a > 0 ? 1 : 0), t = (k * l - a) % b; t != 0 && k <= b; k++, t = (t + l % b) % b);    // 这个循环什么情况下会死循环?

        if (t == 0) {
            t = (k * l - a) / b;
            printf("%d %d\n", t, (t * m + x) % l);
        } else {
            printf("Impossible\n");
        }
    }
    return 0;
}


[ 本帖最后由 voidx 于 2011-8-6 23:25 编辑 ]
2011-08-06 23:23
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
这样的代码都 WA ,而且看了一下,到目前为止只有管理员提交的两个代码通过了,还是,放弃好了

程序代码:
#include <stdio.h>

int main(int argc, char* argv[]) {
    int _x, _y, x, y, m, n, l, t;
    
    scanf("%d %d %d %d %d", &_x, &_y, &m, &n, &l);
    l++;
    m = l - m;
    x = (_x + m) % l;
    y = (_y + n) % l;
    for (t = 1; x != y && (x != _x || y != _y); t++) {
        x = (x + m) % l;
        y = (y + n) % l;
    }
    
    if (x == y) {
        printf("%d %d", t, x);
    } else {
        printf("Impossible");
    }
        
    return 0;
}
2011-08-07 00:25
快速回复:请大家来帮我理解下这个题意
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032444 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved