原题链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1104
题目大意:
n,k,m
n可以 +-*% m,最后求的 n mod k==(初始n+1)mod k
%与mod区别:
%的得数可以有正有负,其正负取决于被除数
mod的得数只能为正
1.
需要处理下%后的正负问题.
不难理解:n mod k==(n%k+k)%k
2.
因为需要mod k 所以最后的答案一定在0~(k-1)之间,需要建立一个数组记录该数是否被遍历过,这样便有了范围。
3.
因为有%m的操作,所以不能直接%k,而使用%(k与m的公倍数,比如k*m)。
剩下就是一般的BFS了。
代码如下:
#include
#include
#include
#include
#include
#include
using namespace std;
typedef pairsi;//first路径second此时n的值
const int MAXN=1e3+10;
bool vis[MAXN];
int n,m,k,km,ans;
void BFS()
{
memset(vis,0,sizeof(vis));
queueq;
si s;
s.first="";
s.second=n;
q.push(s);
while(!q.empty())
{
si ts=q.front();
q.pop();
if((ts.second%k+k)%k==ans)
{
cout<