站外题求条
  • 板块题目总版
  • 楼主_User114514_
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/8/2 19:01
  • 上次更新2024/8/2 20:22:10
查看原帖
站外题求条
1338740
_User114514_楼主2024/8/2 19:01

给出一个 n×nn\times n 的字母矩阵,一开始的位置为左上角,你可以向上下左右四个方向移动, 若移动到了小写字母的格子就不能移动到对应的大写字母的格子, 若移动到了大写字母的格子就不能移动到对应的小写字母的格子 。 问从左上角到右下角至少要几步。

样例:

6
DdaAaA
CBAcca
eEaeeE
bBbabB
DbDdDc
fFaAaC  

输出 :

13

样例解释:

D.....
C.....
e.....
b.bab.
DbD.D.
....aC

求条代码:

#include<bits/stdc++.h>
using namespace std;
int n,ans[105][105];
char mp[105][105];
bool vis[205];
const int dx[]={1,0,-1,0};
const int dy[]={0,1,0,-1};
void bfs(){
	queue<int> qx,qy;
	qx.push(1);
	qy.push(1);
	ans[1][1]=0;
	char noip=mp[1][1];
	if(noip>='A'&&noip<='Z')vis[(noip-'A'+'a')]=1/*,cout<<noip<<"的小写被标记\n"*/;
	else if(noip>='a'&&noip<='z')vis[(noip-'a'+'A')]=1/*,cout<<noip<<"的大写被标记\n"*/;
	while(!qx.empty()){
		int x=qx.front(),y=qy.front();
		qx.pop(),qy.pop();
		for(int i=0;i<4;i++){
			int xx=x+dx[i],yy=y+dy[i];
			if(xx>=1&&xx<=n&&yy>=1&&yy<=n){
				char ioi=mp[xx][yy];
				if(ioi>='A'&&ioi<='Z'&&vis[(ioi-'A'+'a')]==0&&ans[xx][yy]==0x3f3f3f3f){
					//cout<<mp[xx][yy]<<"的小写被标记\n"; 
					vis[(ioi-'A'+'a')]=1;
					ans[xx][yy]=ans[x][y]+1;
					qx.push(xx),qy.push(yy);
				}else if(ioi>='a'&&ioi<='z'&&vis[(ioi-'a'+'A')]==0&&ans[xx][yy]==0x3f3f3f3f){
					//cout<<mp[xx][yy]<<"的大写被标记\n"; 
					vis[(ioi-'a'+'A')]=1;
					ans[xx][yy]=ans[x][y]+1;
					qx.push(xx),qy.push(yy);
				}
			}
		}
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			cin>>mp[i][j];
	memset(ans,0x3f,sizeof(ans));
	bfs();
	cout<<ans[n][n];
	return 0;
}
2024/8/2 19:01
加载中...