最近做了ZOJ1476 weird clock(http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1476),发现有一种甄别重复情况的小技术经常在用..那就是定义数组,作为不同情况的标志,来判断是否重复
其实我们在其他方面,比如dfs,最短路径,或者DP中,用到的used也是这个意思..不过我一直没有把它们联系起来
抽象来说,就是找到不同状态的标识符,并将其离散化(且有限),那么我们总可以利用这种技术加以判定重复,
简单的我们可以使用数组,以下标为标识符
复杂的我们也许还需要借助状态本身的特点,比如二维下标也可以做重复判定,更为复杂的,我们可能还需要利用hash来唯一确定状态..
关键:如何确定状态
顺提一句:一定要记得利用这个方法,尤其是对象状态有限且较少,并且状态改变无记忆性(比如本题)
代码如下
#include <stdio.h>
#define MAX_TIME 60
int 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;
}