欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

杭电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;
}

 

相关标签: 杭电OJ 杭电OJ