题意:给你个n*m的地图, a[n][m]是蛇起始是向左看的。a[1][1]是入口,起始是向右看的。
‘#’是能让穿过的目光发散成四个方向。
题解:
横着走到的是竖着走的坐标,
竖着走到的是横着走的坐标。
起点和终点肯定是横着到达的,所以从dis[1]->dis[n];
竖着的坐标都+n。
然后跑一边最短路。
最后跑了300左右, 大佬们都是30.。。。。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cmath>
#include <vector>
using namespace std;
const int inf=0xffffff;
const int maxn=2005;
int n,m;
vector<int>vec[maxn];
int vis[maxn];
int dis[maxn];
char a[maxn][maxn];
void spfa()
{
for(int i=1;i<=maxn;++i) dis[i]=inf;
memset(vis,0,sizeof(vis));
queue<int>que;
que.push(1);
vis[1]=1;
dis[1]=0;
while(!que.empty()){
int u=que.front();
que.pop();
for(int i=0;i<vec[u].size();++i){
int v=vec[u][i];
if(dis[u]+1<dis[v]){
dis[v]=dis[u]+1;
if(!vis[v]) {
vis[v]=1;que.push(v);
}
}
}
}
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;++i){
getchar();
for(int j=1;j<=m;++j){
scanf("%c",&a[i][j]);
if(a[i][j]=='#'){
vec[i].push_back(j+n);
vec[j+n].push_back(i);
}
}
}
spfa();
if(dis[n]==inf)printf("-1\n");
else printf("%d\n",dis[n]);
return 0;
}
哇,,,这样就62 了。。。以后我都这样输入了,,,,这样更快啊
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cmath>
#include <vector>
using namespace std;
const int inf=0xffffff;
const int maxn=2005;
int n,m;
vector<int>vec[maxn];
int vis[maxn];
int dis[maxn];
char a[maxn][maxn];
void spfa()
{
for(int i=1;i<=maxn;++i) dis[i]=inf;
memset(vis,0,sizeof(vis));
queue<int>que;
que.push(1);
vis[1]=1;
dis[1]=0;
while(!que.empty()){
int u=que.front();
que.pop();
for(int i=0;i<vec[u].size();++i){
int v=vec[u][i];
if(dis[u]+1<dis[v]){
dis[v]=dis[u]+1;
if(!vis[v]) {
vis[v]=1;que.push(v);
}
}
}
}
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;++i)scanf("%s",a[i]+1);
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
if(a[i][j]=='#'){
vec[i].push_back(j+n);
vec[j+n].push_back(i);
}
}
}
spfa();
if(dis[n]==inf)printf("-1\n");
else printf("%d\n",dis[n]);
return 0;
}