怎么回事 DFS 12pts
查看原帖
怎么回事 DFS 12pts
1050776
peterJr楼主2024/7/5 20:28

丰富多彩的结果

#include <iostream>
#include <algorithm>
#include <vector>

#define x first
#define y second

using namespace std;

const int dx[17] = { 0, 0, 1, 0, -1 }, dy[17] = { 0, 1, 0, -1, 0 };

struct node
{
	int p, q;
	char symbol;
};

int n, m, ans = 0x7fffffff;
char a[307][307];
pair<int, int> s[307][307];
int vis[307][307], dr[37];
pair<int, int> fs, st;
vector< node > pr;

void dfs(int p, int q, int curr)
{
	if (p == fs.x && q == fs.y)
	{
		ans = min(ans, curr);
		return;
	}

	if ((s[p][q].x != 0 || s[p][q].y != 0) && !dr[a[p][q] - 'A' + 1])
	{
		dr[a[p][q] - 'A' + 1] = 1;
		vis[s[p][q].x][s[p][q].y] = 1;
		dfs(s[p][q].x, s[p][q].y, curr);
		vis[s[p][q].x][s[p][q].y] = 0;
	}

	for (int i = 1; i <= 4; ++i)
	{
		int dirx = p + dx[i];
		int diry = q + dy[i];
		if (dirx >= 1 && diry >= 0 && dirx <= n && diry < m && !vis[dirx][diry] && a[dirx][diry] != '#')
		{
			vis[dirx][diry] = 1;
			dfs(dirx, diry, curr + 1);
			vis[dirx][diry] = 0;
		}
	}
}

int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; ++i)
	{
		cin >> a[i];
		for (int j = 0; j < m; ++j)
		{
			if (a[i][j] >= 'A' && a[i][j] <= 'Z')
			{
				pr.push_back({i, j, a[i][j]});
				int k;
				for (k = 0; k < pr.size() - 1; ++k)
					if (pr[k].symbol == pr[pr.size() - 1].symbol)
						break;
				if (k != pr.size() - 1)
				{
					s[pr[k].p][pr[k].q] = make_pair(i, j);
					s[i][j] = make_pair(pr[k].p, pr[k].q);
				}
			}
			if (a[i][j] == '=') fs = make_pair(i, j);
			if (a[i][j] == '@') st = make_pair(i, j);
		}
	}

	vis[st.x][st.y] = 1;
	dfs(st.x, st.y, 0);

	cout << ans << endl;

	return 0;
}
2024/7/5 20:28
加载中...