hdu 1104 Remainder(BFS)

原题链接:

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<





你可能感兴趣的:(be17)