1545: 完美变换 BFS (指针标记路径)用Map做标记 (当数组开不下的时候)

1545: 完美变换
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 23 Solved: 8
[Submit][Status][Web Board]
Description
给你一个数n,每次只能进行减1 或者加2的操作,如果n能整除3,可以进行除3的操作,能用最少的次数把n进行以上操作后变为1的操作称为n的一个最小变换,比如7->9->3->1,7->6->2->1 都是n的最小变换,最小变换次数为3,在最小变换中,字典序最小的序列称为完美变换序列。求n的最小变换次数和完美变换序列

Input
输入多组数据,每行输入一个整数n (2<=n<=10^9)

Output
对于每个n,输出最小变换次数,输出一个空格,再输出完美变换序列,序列中每两个数之间用 -> 连接。

Sample Input
7
Sample Output

3 7->6->2->1

#include<bits/stdc++.h>
using namespace std;
const int maxn=10001111;
const int inf=999999999;
#define lson rt<<1,l,m
#define rson rt<<1|1,m+1,r
#define For(i,n) for(int i=0;i<(n);i++)
template<class T>inline T read(T&x)
{
    char c;
    while((c=getchar())<=32);
    bool ok=false;
    if(c=='-')ok=true,c=getchar();
    for(x=0; c>32; c=getchar())
        x=x*10+c-'0';
    if(ok)x=-x;
    return x;
}
template<class T> inline void read_(T&x,T&y)
{
    read(x);
    read(y);
}
template<class T> inline void write(T x)
{
    if(x<0)putchar('-'),x=-x;
    if(x<10)putchar(x+'0');
    else write(x/10),putchar(x%10+'0');
}
template<class T>inline void writeln(T x)
{
    write(x);
    putchar('\n');
}
//  -------IO template------
struct node
{
    int x;
    int id;
    node* fa;//指向他的父亲
    node(){}
    node(int a){x=a;fa=NULL;}
    node(int a,node*_node)
    {
        x=a;
        fa=_node;
    }
};
map<int,int>vis;
stack<int> st;
void bfs(node* x)
{
    queue<node*> q;
    q.push(x);
    vis[x->id]=1;

    while(!q.empty())
    {
        node* s=q.front();q.pop();
       //   printf("%d  %p\n",s->x,s->fa);
        if(s->x==1)
        {
            while(!st.empty())st.pop();
            node *tmp=s;
            while(tmp)
            {
               //printf("%d\n",tmp->x);
               st.push(tmp->x);
               tmp=tmp->fa;
            }
            printf("%d %d",st.size()-1,st.top());st.pop();
            while(!st.empty())
            {
                printf("->%d",st.top());st.pop();
            }
            printf("\n");
            return ;
        }
        if(s->x%3==0&&!vis.count(s->x/3))
        {
            vis[s->x/3]=1;
            node *tmp = (node*)malloc(sizeof(node));
            tmp =new node(s->x/3,s);
            q.push(tmp);
        }
        if(s->x-1>=1&&!vis.count(s->x-1))
        {
            vis[s->x-1]=1;
            node *tmp = (node*)malloc(sizeof(node));
            tmp = new node(s->x-1,s);
            q.push(tmp);
        }
        if(!vis.count(s->x+2))
        {
            vis[s->x+2]=1;
            node *tmp = (node*)malloc(sizeof(node));
            tmp = new node(s->x+2,s);
            q.push(tmp);
        }
    }
}


int  main()
{
    int n,m,i,j,k,t;
    while(~scanf("%d",&n))
    {
        vis.clear();
        node *tmp=(node*)malloc(sizeof(node));
        tmp =new node(n);
        bfs(tmp);
    }
    return 0;
}


























你可能感兴趣的:(map)