我是靠谱客的博主 专注大叔,最近开发中收集的这篇文章主要介绍杭电OJ 1104(C++),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

#include <iostream>
#include <string>
#include <cstring>
#include <queue>
using namespace std;
const int MAXN = 1010;
int vis[MAXN * MAXN];
int n, k, m, ans;
struct node
{
int num; //数值
string str; //运算符
};
//广度优先搜索
void bfs()
{
node cur, cnt; //目前节点,下一个扩展节点
int km = k * m;
ans = ((n + 1) % k + k) % k; //目标结果
memset(vis, 0, sizeof(vis));
queue<node> q;
vis[(n % k + k) % k] = 1; //初始化要遍历的点mod k,避免结果重复,并设置此点为已访问
cur.num = n; //目前值为n
q.push(cur);
while (!q.empty())
{
cur = q.front();
q.pop();
for (int i = 1; i <= 4; i++) //依次搜索四个运算符
{
if (i == 1) //加法
{
cnt.num = (cur.num + m) % km;
cnt.str = cur.str + '+';
}
else if (i == 2) //减法
{
cnt.num = (cur.num - m) % km;
cnt.str = cur.str + '-';
}
else if (i == 3) //乘法
{
cnt.num = (cur.num * m) % km;
cnt.str = cur.str + '*';
}
else //取余
{
cnt.num = ((cur.num % m + m) % m) % km;
cnt.str = cur.str + '%';
}
if ((cnt.num % k + k) % k == ans) //得到目标结果
{
cout << cnt.str.length() << endl;
cout << cnt.str << endl;
return;
}
if (!vis[(cnt.num % k + k) % k]) //若还未访问
{
vis[(cnt.num % k + k) % k] = 1;
q.push(cnt);
}
}
}
cout << 0 << endl; //没有,输出0
}
int main()
{
while (cin >> n >> k >> m)
{
if (n == 0 && k == 0 && m == 0)
break;
bfs();
}
return 0;
}

 

最后

以上就是专注大叔为你收集整理的杭电OJ 1104(C++)的全部内容,希望文章能够帮你解决杭电OJ 1104(C++)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部