小A在WOW中是个小术士.作为一名术士,不会单刷副本是相当丢脸的.所谓单刷副本就是单挑BOSS了,这么有荣誉感的事小A怎么会不做呢?于是小A来到了厄运之槌开始了单刷.小A看了看,厄运之槌的地图是一个N*M的矩形(N,M<=100),上面遍布了小怪和传送门.例如(1表示有小怪,0表示无小怪,大写字母表示传送门,传送门:例如,走到 B 传送门点将传送到另一个 B 传送点(次数无限,但每次进入传送点只传送过去,不会在传送回来)数据保证每个传送门有且仅有相对应的另一个传送门):
image.png
而入口在左上方(1,1),BOSS却躲在右下方(N,M).小A非常急切的想要完成单刷然后去向其他那些战士啊盗贼啊不会单刷的职业炫耀炫耀,所以呢,小A绝不会在小怪身上浪费时间(当然是绕开他们),并且想通过传送门尽快到达BOSS身边.看啊看,想啊想,还是没找出最快的路.终于,灵机一动,想什么啊,编程呗! 输入格式:
第一行2个数据:n m;
下面n行,每行m个数(入口点和BOSS点无怪和传送门),表示厄运之槌的地图。地图数据之间无空格。每步只能走一格,方向上下左右。左上角为入口点,右下角为出口点. 输出格式:
一个整数,表示小A最少需要走多少步。如果小A不能走到目标,则输出"No Solution.". 样例输入一:
3 4 0000 00A0 A000
样例输出一:
4
样例输入二:
4 6 010100 01A100 011101 0000A0
样例输出二:
10
数据范围:
对60%的数据,n,m<=20
对100%的数据,n,m<=100 提示:
样例一路线如图:
image.png样例二:
路线如下:(1,1)-(2,1)-(3,1)-(4,1)-(4,2)-(4,3)-(4,4)-(4,5)(2,3)-(1,3)-(2,3)(4,5)-(4,6) 我的代码
#include<bits/stdc++.h>
using namespace std;
int n,m,vis[105][105],tx[10]={0,0,1,-1},ty[10]={1,-1,0,0},ans=INT_MAX,flag=1;
char a[105][105];
struct node{
int xx;
int yy;
}num[105];
void f(int x,int y,int sum)
{
vis[x][y]=-1;
if(x==n and y==m)
{
flag=0;
ans=min(ans,sum);
}
if(a[x][y]>='A' and a[x][y]<='Z')
{
int zzz=(a[x][y]-'A')*2+1;
if(num[zzz].xx!=x and num[zzz].yy!=y) f(num[zzz].xx,num[zzz].yy,sum+1);
else f(num[zzz+1].xx,num[zzz+1].yy,sum+1);
return ;
}
for(int i=0;i<4;i++)
{
int xxx=x+tx[i];
int yyy=y+ty[i];
if(vis[xxx][yyy]!=-1 and a[xxx][yyy]!='1' and xxx>=1 and xxx<=n and yyy>=1 and yyy<=m) f(xxx,yyy,sum+1);
}
vis[x][y]=0;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
if(a[i][j]>='A' and a[i][j]<='Z')
{
int ss=int(a[i][j]-'A')*2+1;
if(num[ss].xx==0)
{
num[ss].xx=i;
num[ss].yy=j;
}
else
{
num[ss+1].xx=i;
num[ss+1].yy=j;
}
}
}
}
if(a[n-1][m]=='1' and a[n][m-1]=='1')
{
cout<<"No Solution";
return 0;
}
f(1,1,0);
if(flag) cout<<"No Solution";
else cout<<ans;
return 0;
}
蒟蒻求助