HDU 1104 Remainder (BFS求最小步数 打印路径)
2014-11-23 21:28
253 查看
题目链接题意 : 给你N,K,M,N可以+,- ,*,% M,然后变为新的N,问你最少几次操作能使(原来的N+1)%K与(新的N)%k相等。并输出相应的操作。思路 : 首先要注意题中给的%,是要将负数变为正数的,所以取余的时候要注意,又因为各种问题……% 的问题是:a mod b = (a % b + b) % b,不是平常的取余。讨论里有个人是这样说的:
关于此题的用bfs搜索,大家都是知道的。 既然使用了bfs,则队列是少不了的,为了叙述的方便,记运算符集合 oper = {+,-,*,%}, op = {+,-,*}, pe = {+,-,%}。 N在经过一些列的运算,可能会很大,所以溢出问题,需要考虑充分。 因为最后比较的是两个数对k取余是否相等,因此,在队列中存储对 k取余后的值,各种文章中谈论的都是 ((n oper m)%k oper m)%k 是不是等于(n oper m oper m)%k 对于op运算是成立的,但是%参与时,结果是不等。例如: 记n = 2, m = 8, k =3. 则((n * m)%k % m)%k = 1 而(n * m % m)%k = 0。 关于另一个结论:%只能出现在第一个位置或者出现在*的后面,且%最多只能出现两次。 因为对任意n,( n pe m ) % m = n % m. 对于乘法则是不一定的,n * m % m 必为0。 由于一系列{+,-,%}运算相当于在n的基础上,‘+’相当于加上若干个m,‘-’相当于减去若干 个m,‘%’相当于一次同时减去(或者加上)若干个m。而他们的总和带来的结果就是n的变化是 m的整数倍,所以上面的式子相等。也就是说如果有一个序列中有‘%’,则它的前面要么是空的, 要么是‘*’,因为如果是其他的只会使得操作序列更长。例如: +-+-+++%+*+-*-*可以变成%+*+-*-*,后者比前者更短。 *%+-+-***-+*%+*这样的路径也是不存在的,因为*%使得n为0,而后面的*%也为0, 重复,所以不会入队列的。 因为‘%’出现的情况很有限,并且出现的位置,也可以知道。特殊处理一下,就可以了。其他的 对k取余没有问题。
#include <stdio.h> #include <string.h> #include <string> #include <iostream> #include <queue> using namespace std ; struct node { int step ; int an ; string ch ; } p,q,temp; int vis[1001000] ; int n,m,k,km ; void bfs() { queue<node>Q ; memset(vis,0,sizeof(vis)) ; p.an = (n % km) + km ; vis[p.an] = 1 ; p.step = 0 ; Q.push(p) ; while(!Q.empty()) { q = Q.front(); Q.pop(); if(q.an % k == ((n + 1) % k + k)%k ) { printf("%d\n",q.step) ; cout<<q.ch<<endl; return ; } int x = q.an; temp.step = q.step + 1 ; for(int i = 0 ; i < 4 ; i++) { if(i == 0) { temp.an = (x+m) % km; temp.ch = q.ch+'+' ; } else if(i == 1) { temp.an = ((x-m)%km+km)%km; temp.ch = q.ch+'-' ; } else if(i == 2) { temp.an = (x*m)%km; temp.ch = q.ch+'*' ; } else if(i == 3) { temp.an = (x%m)%km; temp.ch = q.ch+'%' ; } if(!vis[temp.an]) { Q.push(temp) ; vis[temp.an] = 1 ; } } } printf("0\n") ; } int main() { while(~scanf("%d %d %d",&n,&k,&m)) { if(n == 0 && m == 0 && k == 0) break ; km = k*m ; bfs() ; } return 0 ; }View Code
相关文章推荐
- HDU 1104 Remainder(BFS打印路径+数论)(%与mod的区别)
- hdu-1104-Remainder(BFS打印路径+数论)(%与mod的区别)
- bfs 较为全面的迷宫路径问题,包括路径的打印,起点到任一点的最小步数.
- hdu 1104 Remainder BFS
- Hdu 1104 Remainder[Bfs]
- HDU 2296 Ring -----------AC自动机,其实我想说的是怎么快速打印字典序最小的路径
- 最大流最小割算法; BFS搜索增广路径; 算法简单,打印结果也比较清晰;
- hdu 1026 Ignatius and the Princess I (bfs打印路径)
- remainder(bfs路径打印)
- hdu 1104 Remainder(BFS)
- HDU 1104 Remainder (BFS(广度优先搜索))
- hdu 1254 推箱子(bfs判断路径可达+bfs搜索最小)
- hdu1104 Remainder bfs找算式是否有解……
- HDU - 1385 Minimum Transport Cost (最短路dijkstra+打印字典序最小路径)
- HDU 1495 非常可乐(bfs)|POJ 3414 Pots(bfs+打印路径)
- HDU 1104 Remainder (BFS)
- HDU 1026 Ignatius and the Princess I BFS打印路径
- HDU 1385 Minimum Transport Cost(Floyd+打印字典序最小路径)
- HDU 1104 Remainder(BFS 同余定理)
- hdu--1026--bfs&&优先队列&&打印路径