为什么第一个样例过不去
查看原帖
为什么第一个样例过不去
948817
nanfeng_楼主2023/4/6 10:16
#include<iostream>
#include<map>
#include<queue>
#include<vector>
using namespace std;
int ca, cb, L;
int n;
typedef pair<int, int> PII;
#define x first
#define y second
const int N = 1e3 + 10;
//队列扩展一次就是当前的最短路线 
void bfs(int a, int b, int id)
{
	map<PII, vector<int>>step;
	queue<PII>q;
	q.push({ a,b });
	map<PII, int>dist;
	dist[{a, b}] = 0;
	while (q.size())
	{
		auto t = q.front();
		q.pop();
		if (t.y == L)
		{
			cout << dist[{t.x, t.y}] << ' ';
			for (auto s : step[{t.x, t.y}])
			{
				cout << s << ' ';
			}
			cout << endl;
			return;
		}
		int a = t.x, b = t.y;//该点向六个方向进行扩展 
		if (a != ca)
		{
			step[{ca, b}] = step[{a, b}];
			step[{ca, b}].push_back(1);
			if (!dist.count({ ca,b }))
			{
				q.push({ ca,b });
				dist[{ca, b}] = dist[{a, b}] + 1;
			}

		}
		if (b != cb)
		{
			step[{a,cb}] = step[{a, b}];
			step[{ a,cb }].push_back(2);
			if (!dist.count({ a,cb }))
			{
				q.push({ a,cb });
				dist[{a, cb}] = dist[{a, b}] + 1;
			}
		}
		if (a != 0)
		{
			step[{0, b}] = step[{a, b}];
			step[{0,b }].push_back(3);
			if (!dist.count({ 0,b }))
			{
				q.push({ 0,b });
				dist[{0, b}] = dist[{a, b}] + 1;
			}
		}
		if (b != 0)
		{
			step[{a, 0}] = step[{a, b}];
			step[{a,0 }].push_back(4);
			if (!dist.count({ a,0 }))
			{
				q.push({ a,0 });
				dist[{a, 0}] = dist[{a, b}] + 1;
			}
		}
		if (b != 0&&a != ca)
		{

			int s, t;
			if (b > ca - a)
			{
				t = b - ca + a;
				s = ca;
			}
			else
			{
				s = a + b;
				t = 0;
			}
			step[{s, t}] = step[{a, b}];
			step[{ s,t }].push_back(5);
			if (!dist.count({ s,t }))
			{
				q.push({ s,t });
				dist[{s, t}] = dist[{a, b}] + 1;
			}
		}
		if (a != 0 && b != cb)
		{
			int s, t;
			if (a > cb - b)
			{
				s = a - cb + b;
				t = cb;
			}
			else
			{
				s = 0;
				t = b + a;
			}
			step[{s, t}] = step[{a, b}];
			step[{s,t}].push_back(6);
			if (!dist.count({ s,t }))
			{
				q.push({ s,t });
				dist[{s, t}] = dist[{a, b}] + 1;
			}
		}
	}
}
int main()
{
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		cin >> ca >> cb >> L;
	    bfs(0, 0, i);
	}
	return 0;
}
2023/4/6 10:16
加载中...