站外题求助(答对必关)
  • 板块学术版
  • 楼主封禁用户
  • 当前回复3
  • 已保存回复3
  • 发布时间2025/2/6 20:41
  • 上次更新2025/2/7 08:52:31
查看原帖
站外题求助(答对必关)
1172967
封禁用户楼主2025/2/6 20:41

一道有趣的题提交(Submit) 中文

时间:1s 空间:32M

题目描述:

你正在设计一个网格地图游戏,网格满足如下条件

1:恰好有一个出口

2:可能有一些门,门的标号为大写字母A-Z,每种门最多只有一个

3:可能有一些钥匙,钥匙的标号为小写字母a-z,每种钥匙只能打开对应的大写字母的门

4:可能有一些空地,空地的标号为小数点

5:可能有一些障碍,障碍不能经过

对于一个地图,你想要知道有多少的空地可以到达出口,为了使游戏显得不那么简单,你想要知道到达出口至少开一扇门的的空地有多少个

输入格式: 第一行输入两个整数n,m, (1≤n≤50)

接下来n行每行输入m个字符 (1≤m≤50)

'.' 代表空地

'#' 代表障碍

'*'代表出口

输出格式: 输出一个整数

样例输入1:

6 7
...#.A.
.#B#.#.
.#.#.#.
.#.#.#.
.#b#.#.
a#...#*

样例输出1:

10

样例输入2:

3 5 
a#a#*
#..#.
a..A.

样例输出2:

4

我的WA60代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;

int n, m, vis[55][55], num[50], ans = 0;
string a[55];

struct node {
	int x, y;
};

struct cmp {
	bool operator()(const node& x, const node& y) const {
		if (a[x.x][x.y] == '.' || (a[x.x][x.y] >= 'a' && a[x.x][x.y] <= 'z')) return 0;
		if (a[y.x][y.y] == '.' || (a[y.x][y.y] >= 'a' && a[y.x][y.y] <= 'z')) return 1;
		if (num[a[x.x][x.y] - 'A'] == 1) return 0;
		if (num[a[y.x][y.y] - 'A'] == 1) return 1;
//      return (a[x.x][x.y]=='.')||(num[a[x.x][x.y]-'A'])
		return 0;
	}
};

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

bool bfs(int x, int y) {
	int f1 = 0, f2 = 0;
	priority_queue<node, vector<node>, cmp> q;
	q.push(node{x, y});
	while (q.size()) {
		node t = q.top();
//      if(x==3&&y==5){
//          cout<<t.x<<" "<<t.y<<" "<<a[t.x][t.y]<<" "<<(a[t.x][t.y]>='a'&&a[t.x][t.y]<='z')<<"\n";
//      }
		if (a[t.x][t.y] == '*') {
			f1 = 1;
		}
		q.pop();
		vis[t.x][t.y] = 1;
		if (a[t.x][t.y] >= 'A' && a[t.x][t.y] <= 'Z' && num[a[t.x][t.y] - 'A'] == 0) continue;
		if (a[t.x][t.y] >= 'A' && a[t.x][t.y] <= 'Z') f2 = 1;
		if (a[t.x][t.y] >= 'a' && a[t.x][t.y] <= 'z') num[a[t.x][t.y] - 'a'] = 1;
		for (int i = 0; i < 4; i++) {
			int tx = t.x + dx[i];
			int ty = t.y + dy[i];
//          if(x==2&&y==5){
//              cout<<"   "<<tx<<" "<<ty<<" "<<a[tx][ty]<<"\n";
//          }
			if (tx < 1 || ty < 1 || tx > n || ty > m || a[tx][ty] == '#' || vis[tx][ty] != 0) continue;
//          if(x==2&&y==5) cout<<"can\n";
			vis[tx][ty] = 1;
			q.push(node{tx, ty});
		}
	}
//  if(x==2&&y==5){
//      cout<<"   "<<f1<<" "<<f2<<"\n";
//  }
	if (f1 == 1 && f2 == 1) return 1;
	return 0;
}
signed main(void) 
{
	ios::sync_with_stdio(0);
	cin.tie(), cout.tie();
	
	cin >> n >> m;
	
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		a[i] = ' ' + a[i];
	}
	
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			if (a[i][j] == '.') {
				memset(vis, 0, sizeof vis);
				memset(num, 0, sizeof num);
//              cout<<i<<" "<<j<<"\n";
				if (bfs(i, j) == 1) {
//                  cout<<i<<" "<<j<<"\n";
					ans++;
				}
			}
		}
	}
	
	cout << ans;
	
	return 0;
}
2025/2/6 20:41
加载中...