非地图的广度优先搜索,此题数据过大,要用数组来模拟队列。
题目链接:http://acm.jlu.edu.cn/joj/showproblem.php?pid=2431
#include <iostream>
#include <queue>
using namespace std;
#define MAXN 1000000
int dis[MAXN];
int vis[MAXN];
int main()
{
int x, n, temp, cur;
queue<int> myqueue;
while(cin>>x>>n)
{
memset(vis,0,sizeof(vis));
memset(dis,0,sizeof(dis));
if(x>n)
{
x = x%n;
}
while(!myqueue.empty())
myqueue.pop();
myqueue.push(x);
vis[x] = 1;
while(vis[0]!=1)
{
temp = myqueue.front();
myqueue.pop();
cur = (temp*2)%n;
if(vis[cur]!=1)
{
myqueue.push(cur);
dis[cur] = dis[temp] + 1;
vis[cur] = 1;
}
cur = (temp+1)%n;
if(vis[cur]!=1)
{
myqueue.push(cur);
dis[cur] = dis[temp] + 1;
vis[cur] = 1;
}
}
cout<<dis[0]<<endl;
}
return 0;
}