玄关求问
查看原帖
玄关求问
739307
All_Failed_OI_Cici楼主2024/8/18 19:40

站外题。题面在下面。试问我的代码目测有没有细节性问题?在OJ上测得65pts。

题目描述

给定n×n的矩阵,M表示一个迷宫,左上角(1,1)表示起点,右下角(n,n)表示终点,小六子需要从起点出发穿过迷宫,最终到达终点。 矩阵中存在一些字符,分别代表的意义如下:

  1. 字符#表示城墙;
  2. 字符.表示道路;
  3. 字符1-9表示带有积分的道路。

同时移动的时候有以下规则:

  1. 小六子只能上下左右移动;
  2. 小六子在移动的时候不能走到#所在的位置;
  3. 小六子移动的时候可以移动到.所在的位置,但是不会获得积分;
  4. 小六子移动到带有数字字符的位置时,可以获得字符对应的数字大小的积分;
  5. 小六子每移动一格就会消耗一点体力。
    现在小六子希望你可以帮助他找到一条到终点消耗体力最小,且获得积分最多的那条路径。

输入格式

第一行输入一个正整数n,表示迷宫的大小。

接下来n行,每行输入n个字符,表示迷宫的内容。

输出格式

输出两个整数,分别代表小六子消耗的体力,以及获得的积分。若是不能从起点到终点,则输出-1 -1;

样例

样例1

输入

3
.##
.##
1..

输出

4 1

样例2

输入

3
.22
2#.
1..

输出

4 4

code

#include<bits/stdc++.h>
using namespace std;
struct node{
	int x,y;
};
int dx[4]={0,0,-1,1};
int dy[4]={-1,1,0,0};
const int N=1e3+10;
int step[N][N];
int s[N][N];
char mp[N][N];
bool vim[N][N];
int n;
void bfs(){
	memset(step,0x3f,sizeof(step));
	queue<node> q;
	q.push({1,1});
	step[1][1]=0;
	while(!q.empty()){
		node m=q.front();
		q.pop();
		if(vim[m.x][m.y]) continue;
		vim[m.x][m.y]=true;
		for(int j=0;j<4;j++){
			int tx=m.x+dx[j];
			int ty=m.y+dy[j];
			if(mp[tx][ty]!='#'&&tx>=1&&tx<=n&&ty>=1&&ty<=n){
				if(step[tx][ty]>step[m.x][m.y]+1){
					step[tx][ty]=step[m.x][m.y]+1;
					s[tx][ty]=s[m.x][m.y]+(mp[tx][ty]=='.'?0:mp[tx][ty]-'0');
//					s[tx][ty]=s[m.x][m.y];
//					if(mp[tx][ty]>='1'&&mp[tx][ty]<='9'){
//						s[tx][ty]+=mp[tx][ty]-'0';
//					}
					vim[tx][ty]=false;
					q.push({tx,ty});
				}
				else if(step[tx][ty]==step[m.x][m.y]+1){
					s[tx][ty]=max(s[m.x][m.y]+(mp[tx][ty]=='.'?0:mp[tx][ty]-'0'),s[tx][ty]);
//					if(mp[tx][ty]>='1'&&mp[tx][ty]<='9'){
//						s[tx][ty]=max(s[tx][ty],s[m.x][m.y]+mp[tx][ty]-'0');
//					}
//					else s[tx][ty]=max(s[tx][ty],s[m.x][m.y]);
					vim[tx][ty]=false;
					q.push({tx,ty});
				}
				if(tx==n&&ty==n) return;
			}
		}
	}
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>mp[i][j];
		}
	}
	bfs();
	if(step[n][n]==0x3f3f3f3f) cout<<"-1 -1";
	else cout<<step[n][n]<<" "<<s[n][n];
	return 0;
}

thx大佬

2024/8/18 19:40
加载中...