经典的BFS问题,第二个开个三维vis用来记录方向就可以了。
#include
#include
#include
#include
#include
#include
using namespace std;
#define N 510
struct rng{
int x,y,d;
int v;
friend bool operator <(rng a,rng b){
return a.v>b.v;
}
};
char a[N<<3];
int map[N][N];
int n,dir[][2]={0,1,0,-1,1,0,-1,0},m,r1,c1,r2,c2;
int bfs1(){
int i;
priority_queueq;
rng u;
u.x=r1-1;
u.y=c1-1;
u.v=map[r1-1][c1-1];
bool vis[N][N];
memset(vis,false,sizeof(vis));
q.push(u);vis[r1-1][c1-1]=true;
while(!q.empty()){
u=q.top();
q.pop();
for(i=0;i<4;i++){
int w=u.x+dir[i][0];
int e=u.y+dir[i][1];
if(w>=0&&w<n&&e>=0&&e<m&&map[w][e]!=-1&&!vis[w][e]){
rng p;
p.x=w,p.y=e;p.v=u.v+map[w][e];
vis[w][e]=true;
if(vis[r2-1][c2-1]) return p.v;
q.push§;
}
}
}
return -1;
}
int bfs2(){
int i;
priority_queueq;
bool vis[N][N][4];
rng u;
u.x=r1-1,u.y=c1-1;u.v=map[r1-1][c1-1];
u.d=-1;
memset(vis,false,sizeof(vis));
q.push(u);
while(!q.empty()){
u=q.top();
q.pop();
for(i=0;i<4;i++){
int w=u.x+dir[i][0];
int e=u.y+dir[i][1];
if(w>=0&&w<n&&e>=0&&e<m&&map[w][e]!=-1&&u.d!=i&&!vis[w][e][i]){
rng p;
p.x=w,p.y=e;p.v=u.v+map[w][e];
p.d=i;
vis[w][e][i]=true;
if(wr2-1&&ec2-1) return p.v;
q.push§;
}
}
}
return -1;
}
int main(){
int i,j;
int kase=0;
while(scanf(“%d %d %d %d %d %d”,&n,&m,&r1,&c1,&r2,&c2)!=EOF){
getchar();
for(i=0;i<n;++i){
gets(a);
int temp=0;
int len=strlen(a);
for(j=0;j<len;++j){
if((a[j]>=‘0’&&a[j]<=‘9’)||a[j]==‘*’){
if(a[j]==‘*’){
map[i][temp]=-1;
temp++;
}
else {
if(a[j+1]>=‘0’&&a[j+1]<=‘9’&&a[j+2]>=‘0’&&a[j+2]<=‘9’){
map[i][temp]=100;j=j+2;
}
else if(a[j+1]>=‘0’&&a[j+1]<=‘9’){
map[i][temp]=(a[j]-‘0’)*10+(a[j+1]-‘0’);
j=j+1;
}
else {
map[i][temp]=a[j]-‘0’;
}
temp++;
}
}
}
}
公种号:编程进阶路
//for(i=0;i<n;i++) {for(j=0;j<m;j++) cout<<map[i][j];cout<<endl;}
printf(“Case %d: %d %d\n”,++kase,bfs1(),bfs2());
}
return 0;
}
总结
最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的Android开发中高级必知必会核心笔记,共计2968页PDF、58w字,囊括Android开发648个知识点,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
2021年虽然路途坎坷,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。
虽然面试失败了,但我也不会放弃入职字节跳动的决心的!建议大家面试之前都要有充分的准备,顺顺利利的拿到自己心仪的offer。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
2021年虽然路途坎坷,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。
虽然面试失败了,但我也不会放弃入职字节跳动的决心的!建议大家面试之前都要有充分的准备,顺顺利利的拿到自己心仪的offer。