hdu 1104

其实这题主要难在数论。难啊难。多看看别人的思路点击打开链接点击打开链接

#include<cstdio>
#include<queue>
#include<cstring>
#include<string>
#include<iostream>
using namespace std;
const int maxn = 1000 + 5;
struct node
{
    int num, step;
    string road;
}beg;
int vis[maxn];
int n, k, m, ans;
const char op[] = {'+', '-', '*', '%'};
int cal(int factor, int oper)
{
    switch(oper)
    {
    case 0:
        return (factor + m ) % (m * k);
    case 1:
        return (factor - m) % (m * k);
    case 2:
        return (factor * m) % (m * k);
    case 3:
        return (factor % m + m) % m %(m * k);
    }
}
void print(node q)
{
    printf("%d\n", q.step);
    cout<<q.road<<endl;
}
void bfs()
{
    if((n % k + k )% k == ans) {printf("0\n"); return ;}
    memset(vis, 0, sizeof(vis));
    queue<node> q;
    beg.road = "";
    q.push(beg);
    vis[(n % k + k) % k] = 1;
    while(!q.empty())
    {
        node sq = q.front();
        q.pop();
        for(int i = 0; i < 4; i++)
        {
            node tq =sq;
            //printf("%d\n", tq.num);
            tq.num = cal(tq.num, i);
            tq.road = tq.road + op[i];
            tq.step = tq.step + 1;
            if(!vis[(tq.num % k + k) % k])
            {
                //printf("%d\n", tq.num);
                vis[(tq.num % k + k) % k] = 1;
                if((tq.num % k + k ) %k == ans) {print(tq); return;}
                q.push(tq);
            }
        }
    }
    printf("0\n");
}
int main()
{
    while(scanf("%d%d%d", &n, &k, &m) == 3 && (n || k || m))
    {
        ans = ((n + 1) % k + k ) % k;
        //printf("%d\n", ans);
        beg = (node){n, 0};
        //printf("%d %d\n", beg.num, beg.step);
        bfs();
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值