一个关于甄别重复的小点(ZOJ1476引发的想法)

来源:互联网 发布:sql limit和order by 编辑:程序博客网 时间:2024/05/09 02:06

最近做了ZOJ1476 weird clock(http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1476),发现有一种甄别重复情况的小技术经常在用..那就是定义数组,作为不同情况的标志,来判断是否重复


其实我们在其他方面,比如dfs,最短路径,或者DP中,用到的used也是这个意思..不过我一直没有把它们联系起来


抽象来说,就是找到不同状态的标识符,并将其离散化(且有限),那么我们总可以利用这种技术加以判定重复,


简单的我们可以使用数组,以下标为标识符


复杂的我们也许还需要借助状态本身的特点,比如二维下标也可以做重复判定,更为复杂的,我们可能还需要利用hash来唯一确定状态..


关键:如何确定状态


顺提一句:一定要记得利用这个方法,尤其是对象状态有限且较少,并且状态改变无记忆性(比如本题)


代码如下


#include <stdio.h>#define MAX_TIME 60int main(){/*    freopen("test.txt", "r", stdin);*/    int s, d;    int i;    int num;    int time[MAX_TIME];    while (scanf("%d %d", &s, &d), s != 0 || d != 0)    {        for (i = 0; i < MAX_TIME; i++)            time[i] = 0;        time[s] = 1;        num = 0;        while (s != 0)        {            s = (s * d + s) % MAX_TIME;            /*判断重复与否*/            if (time[s] == 1)                break;            time[s] = 1;            num++;        }        if (s == 0)            printf("%d\n", num);        else            printf("Impossible\n");    }    return 0;}



原创粉丝点击