杭电OJ 1104(C++)
程序员文章站
2022-07-13 17:38:30
...
#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;
}
上一篇: 本地仓库和github仓库连接
下一篇: 杭电OJ 1103(C++)