http://acm.hdu.edu.cn/showproblem.php?pid=1104
严格来讲考察的主要不是数论,而是审题。。而且正好学完BFS,拿来练手还是不错的。
最坑爹的就是这个%的问题。对于a%b,a如果是正数就没有问题,如果是负数就会变成a%b+b(因为要求结果为正)。统一格式成mod(a,b)=(a%b+b)%b比较方便。
另一个问题就是数据过大的时候我们需要对结果取模。如果每步结束后都只是%k结果似乎就会WA,这里是因为存在N%m这个运算,所以需要把取模的范围扩大到%mk(超出表达能力范围了- -)。
另外还发现了string比字符数组更优越的功能,有点小激动。。
代码如下:
#include<cstdio>
#include<queue>
#include<string>
#include<cstring>
#include<iostream>
using namespace std;
struct node
{
int num;
int step;
string op;
};
int n,k,m,target;
int vis[1000010];
int mod(int a,int b)
{
return (a%b+b)%b;
}
void bfs()
{
queue<node> s;
node next,q;
int i;
q.num=n;q.op="";q.step=0;
s.push(q);vis[mod(n,k)]=1;
while(!s.empty())
{
q=s.front();
s.pop();
if(mod(q.num,k)==target) {cout<<q.step<<endl<<q.op<<endl;return;}
else
{
next.step=q.step+1;
for(i=0;i<4;i++)
{
if(i==0) {next.num=(q.num+m)%(m*k);next.op=q.op+'+';}
else if(i==1) {next.num=(q.num-m)%(m*k);next.op=q.op+'-';}
else if(i==2) {next.num=(q.num*m)%(m*k);next.op=q.op+'*';}
else {next.num=mod(q.num,m)%(m*k);next.op=q.op+'%';}
if(!vis[mod(next.num,k)]) {s.push(next);vis[mod(next.num,k)]=1;}
}
}
}
printf("0\n");
return;
}
int main()
{
while(1)
{
scanf("%d%d%d",&n,&k,&m);
if(n==0||k==0||m==0) break;
target=mod(n+1,k);
memset(vis,0,sizeof(vis));
bfs();
}
return 0;
}

本文通过一道具体题目,探讨了如何使用广度优先搜索(BFS)解决涉及数学运算及取模操作的问题,并分享了一些编程技巧,如字符串操作等。
883

被折叠的 条评论
为什么被折叠?



