hdu 1104

好久没写过题解了,最近都在切水题,没什么可写,今天这题感觉一定要写写,刚开始一直思考路径无果,后来想到路径可以用字符串转移,这个击破后就以为一番风顺了,然而死在了取模那里,负数取模,应该变成正数,这样wa了几次,曾一度怀疑是我空间爆了,事实证明不是,虽然是4^n,显然最大是k*m全部访问,显然字符长度和那个n是一致的,4^n<=k*m显然n很小,也就是空间不会爆,开始没想到这点,我还被队友骂了,说我太暴力了。。。最近是太暴力了,开了个1E的数组水了一题。。。

    这题主要就是取模,bfs,还有路径处理。

Run IDSubmit TimeJudge StatusPro.IDExe.TimeExe.MemoryCode Len.LanguageAuthor
50951632011-12-01 23:23:05Accepted110478MS424K1700 BC++xym2010
代码

#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<cmath>
#include<queue>
#include<map>
#include<algorithm>
#define For(i,a,n) for(int i=a;i<n;i++)
#define rep(i,n) For(i,0,n)
using namespace std;
int n,m,k,fina;
char ch[4]={'+','-','*','%'};
struct node
{
    int num,step;
    string road;
}ans;
int deal(int x,int key)
{
    if(key==0)
        return x+m;
    else if(key==1)
        return x-m;
    else if(key==2)
        return x*m;
    else
    {
        int tem=x%m;
        if(tem<0)
            tem=tem+m;
        return tem;
    }
}
void bfs()
{
    int tem;
    map < int,int > mp;
    mp[n]=1;
    queue< node >q;
    node in,out;
    in.num=n,in.step=0,in.road="";
    q.push(in);
    while(!q.empty())
    {
        out=q.front();q.pop();
        rep(i,4)
        {
            tem=deal(out.num,i)%(k*m);
            if(mp[tem]==0)
            {
                in.num=tem,in.step=out.step+1,in.road=out.road+ch[i];
                mp[tem]=1;
                int x=tem%k;
                if(x<0)
                    x=x+k;
                if(x==fina)
                {
                    ans=in;
                    return ;
                }
                else
                q.push(in);
            }
        }
    }
}
int main()
{
    
    while(1)
    {
        scanf("%d%d%d",&n,&k,&m);
        if(n==m&&m==k&&k==0)return 0;
            fina=(n+1)%k;
            if(fina<0)
                fina+=k;
            ans.step=0;
            bfs();
            printf("%d\n",ans.step);
            if(ans.step)
                cout<<ans.road<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值