标签:bfs
很不错的一道搜索题目,但是有几个关键问题要注意。
【key】解决办法有两个,要么就是过程中不进行任何操作,但是数据很容易溢出,及时开成long long(尝试交过WA了,6次乘法就爆了)
还有一种方法最好,每一步用%(k*m)替代%k(具体证明考察你的数学基础O(∩_∩)O),这样,既能把运算结果控制在一定范围内避免溢出,又能很好的解决%m%k的非线性同余,一举两得!~
/*Author:Hacker_vision*/
#include<bits/stdc++.h>
#define clr(k,v) memset(k,v,sizeof(k))
typedef long long ll;
using namespace std;
const int _max=1e6+10;
int n,m,k,res,deep,km;
bool vis[_max];
struct node{
ll num;
string str;
};
queue<node>Q;
void bfs(){
node q;
q.num=n;
q.str="";
Q.push(q);
vis[(n%k+k)%k]=true;
while(!Q.empty()){
q=Q.front();
Q.pop();
if((q.num%k+k)%k==res) {
cout<<q.str.size()<<endl;//cout<<q.num<<endl;
cout<<q.str<<endl;
return;
}
node p;p.num=q.num+1;
for( int i = 0; i < 4; ++ i) {//遍历孩子节点
if(i==0){
p.num=(q.num+m)%km;
p.str=q.str+‘+‘;
}
else if(i==1){
p.num=(q.num-m)%km;
p.str=q.str+‘-‘;
}
else if(i==2){
p.num=(q.num*m)%km;
p.str=q.str+‘*‘;
}
else{
p.num=((q.num%m+m)%m)%km;
p.str=q.str+‘%‘;
}
if(!vis[(p.num%k+k)%k]){ //操作有限化,访问过的节点不必入队
Q.push(p);
vis[(p.num%k+k)%k]=true;
}
}
}
puts("0");
}
int main(){
// freopen("input.txt","r",stdin);
while(cin>>n>>k>>m,(n||m||k)){
res=((n+1)%k+k)%k;//计算机%与理论mod有出入,不管是不是负数都这样处理,省去判断了
clr(vis,0);
km=k*m; //%km避免数据溢出且能满足%的线性同余
while(!Q.empty()) Q.pop(); //库函数就不能写个Q.clear()嘛!!!/(ㄒoㄒ)/~~
bfs();
}
return 0;
}
Ctrl + B
Ctrl + I
Ctrl + Q
Ctrl + L
Ctrl + K
Ctrl + G
Ctrl + H
Ctrl + O
Ctrl + U
Ctrl + R
Ctrl + Z
Ctrl + Y
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:bfs
原文地址:http://blog.csdn.net/u012717411/article/details/47049149