hdu1104 BFS + 数论
来源:互联网 发布:nginx 域名访问不了 编辑:程序博客网 时间:2024/05/22 08:03
写了一份代码,觉得没错,找啊找,找啊找,就是找不出来,最后网上找一份代码,改写成一样模式的,就是变量名不一样,我去,还是WA,无语!!!果断粘别人的代码
开始给了你n, k, m。。。。每次由+m, -m, *m, modm得到新的N,继续对N这样的操作,直到(n+1) mod k== N mod k时结束。。。并且打印路径
%与mod的区别:%出来的数有正有负,符号取决于左操作数。。。而mod只能是正(因为a = b * q + r (q > 0 and 0 <= r < q), then we have a mod q = r 中r要大于等于0小于q)。。。。。
所以要用%来计算mod的话就要用这样的公式:a mod b = (a % b + b) % b
括号里的目的是把左操作数转成正数
由于新的N可以很大,所以我们每一步都要取%,而且最后要mod k,正常来说每步都%k就行了,但是由于其中的一个操作是N%m,所以我们每一步就不能%k了(%k%m混用会导致%出来的答案错误),而要%(k *m)(其实%(k,m的公倍数都行))
然后,vis[这里放的要是遍历的点mod k (想清楚标记的目的是避免结果重复)]
而那四个操作避免过大则取余就可以了,而不需要取mod
#include <iostream>#include <string>#include <queue>#include <vector>using namespace std;const int M = 1000010;int n, m, k, km;bool vis[M];struct Node{ int num; int step; string road;};void Bfs(){ memset(vis, 0, sizeof(vis)); queue <Node> q; Node q1; q1.num = n; q1.step = 0; q1.road = ""; q.push(q1); vis[(n % k + k) % k] = 1;// while (!q.empty()) { Node q2 = q.front(); q.pop(); if (((n+1)%k + k) % k == (q2.num%k + k) % k) { printf("%d\n", q2.step); cout << q2.road << endl; return; } q1.step = q2.step + 1; for (int i = 0; i < 4; i++) { if (i == 0) { q1.num = (q2.num + m) % km;//取余就可以了,不需要取mod q1.road = q2.road + '+';//记录路径 } else { if (i == 1) { q1.num = (q2.num - m) % km; q1.road = q2.road + '-'; } else { if (i == 2) { q1.num = (q2.num * m) % km; q1.road = q2.road + '*'; } else { q1.num = (q2.num % m + m) % m % km; q1.road = q2.road + '%'; } } } if (!vis[(q1.num % k + k) % k]) { q.push(q1); vis[(q1.num % k + k) % k] = 1; } } } puts("0");}int main(){ //int t; //scanf("%d", &t); while (~scanf("%d%d%d", &n, &k, &m), n||m||k)//由正负的时候别用n+m+k { km = k * m; Bfs(); } return 0;}
0 0
- hdu1104 Remaindr-----bfs+数论
- hdu1104 BFS + 数论
- 数论 + bfs Remider hdu1104
- hdu1104
- hdu1104 Remainder bfs找算式是否有解……
- 【搜索】HDU1104
- hdu 1104 BFS + 数论
- hdu 1664 BFS + 数论
- 1104 Remainder(数论+bfs)
- POJ_3126_Prime Path(数论+BFS)
- hdu 1104 remainder bfs+数论
- HDU 4294 Multiple (数论+bfs)
- hdu 1104 (数论+bfs)
- HDOJ1104 Remainder(数论+BFS)
- POJ3126 Prime Path【数论】【BFS】
- zoj 1136 Multiple(bfs+数论+string)
- uva 718 - Skyscraper Floors(数论+bfs)
- uva 1341 - Different Digits(数论+bfs)
- hdu3833YY's new problem
- javascript call和apply
- java学习第一阶段4
- Tomcat中HttpServletResponse的实现类
- PHP实现同一个帐号不允许多人同时重复登陆
- hdu1104 BFS + 数论
- bootstrap的选项卡和选项卡的内容
- 矢量的概念
- 数据挖据十大算法之ID3算法(1)
- 一致性hash算法
- Ant构建Java项目
- DES与AES加密算法
- AsyncTask简单实例
- error undefined reference to '__android_log_print'