站外题。题面在下面。试问我的代码目测有没有细节性问题?在OJ上测得65pts。
给定n×n的矩阵,M表示一个迷宫,左上角(1,1)表示起点,右下角(n,n)表示终点,小六子需要从起点出发穿过迷宫,最终到达终点。 矩阵中存在一些字符,分别代表的意义如下:
同时移动的时候有以下规则:
#所在的位置;.所在的位置,但是不会获得积分;第一行输入一个正整数n,表示迷宫的大小。
接下来n行,每行输入n个字符,表示迷宫的内容。
输出两个整数,分别代表小六子消耗的体力,以及获得的积分。若是不能从起点到终点,则输出-1 -1;
3
.##
.##
1..
4 1
3
.22
2#.
1..
4 4
#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大佬