大家好,我是泡泡,给大家带来每日一题的目的是为了更好的练习算法,我们的每日一题为了让大家练到各种各样的题目,熟悉各种题型,一年以后,蜕变成为一个不一样的自己!
欢迎关注点赞收藏⭐️留言
❤️ :热爱C/C++与算法学习,云计算等,期待一起交流!
作者水平有限,如果发现错误,求告知,多谢!
高校算法学习社区:高校算法学习社区-CSDN社区云
一起加入刷题内卷大军,还可以加入专属内卷群,里面福利多多大佬多多!
题目难度:⭐️⭐️
题目涉及算法:最短路,图论,dfs,bfs。
ps:有能力的小伙伴可以尝试优化自己的代码或者一题多解,这样能综合提升自己的算法能力
解法1dfs:
我们定义一个ans值为正无穷,在进行搜索的时候如果遇到b就取最小值并返回,如果搜索的路比当前ans值大说明错了也返回,剩下的就是加一个回溯往下搜索,时间为112ms(应该是)
解法2bfs:
同样需要一个ans,在队列内循环判断的时候每次都找最短的哪一个,记得记录起点终点,其他的就是正常的bfs了。
解法三spfa:
(我真的好喜欢队列)这就按照正常的模板,然后搞一个数组保存路径,出来之后判断最短的哪一个!不懂得看这个文章spfa
DFS
#include
using namespace std;
const int N = 1001;
char s[N][N];
int st[N][N];
int ans=0x3f3f3f3f;
int lx,ly,fx,fy,n;
int dx[]={1,-1,0,0};
int dy[]={0,0,-1,1};
void dfs(int x,int y,int sum,int num)
{
if(s[x][y]=='B')
{
ans=min(ans,sum);
return ;
}
if(sum>=ans)
{
return ;
}
for(int i=0;i<4;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
if(xx>=0&&xx=0&&yy>n;
for(int i=0;i>s[i][j];
}
}
for(int i=0;i
BFS:
#include
using namespace std;
const int N=1001;
char s[N][N];
int st[N][N];
int dist[N][N];
int lx,ly,fx,fy,n;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int flag,ans=0x3f3f3f3f;
struct node{
int x,y,num;
};
int check(int x,int y)
{
if(x>=1&&x<=n&&y>=1&&y<=n&&s[x][y]!='x')
{
return true;
}
return false;
}
void bfs()
{
if(lx==fx&&ly==fy)
{
flag=1;
ans=0;
return ;
}
queueq;
q.push({lx,ly,-1});
st[lx][ly]=1;
while(q.size())
{
node t=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int x=t.x+dx[i];
int y=t.y+dy[i];
int cnt=t.num+1;
while(check(x,y))
{
if(!st[x][y])
{
st[x][y]=1;
q.push({x,y,cnt});
if(x==fx&&y==fy)
{
flag=1;
ans=min(ans,cnt);
return ;
}
}
x+=dx[i];
y+=dy[i];
}
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>s[i][j];
if(s[i][j]=='A')
{
lx=i;
ly=j;
}
else if(s[i][j]=='B')
{
fx=i;
fy=j;
}
}
}
bfs();
if(flag)
{
cout<
spfa:
#include
using namespace std;
const int N = 1001;
char s[N][N];
int lx,ly,fx,fy,n;
int vis[N][N][4],dis[N][N][4];
struct node{
int x,y,num;
};
int dx[]={1,-1,0,0};
int dy[]={0,0,-1,1};
bool pd(int x,int y)
{
if(x<1||y<1||x>n||y>n||s[x][y]=='x')
{
return true;
}
return false;
}
void spfa()
{
queueq;
memset(dis,0x3f3f3f3f,sizeof(dis));
for(int i=0;i<4;i++)
{
q.push({lx,ly,i});
dis[lx][ly][i]=0;
}
while(q.size())
{
node t=q.front();
q.pop();
vis[t.x][t.y][t.num]=0;
for(int i=0;i<4;i++)
{
int xx=t.x+dx[i],yy=t.y+dy[i];
if(pd(xx,yy))
{
continue;
}
int dd=(i!=t.num);
if(dis[xx][yy][i]>dis[t.x][t.y][t.num]+dd)
{
dis[xx][yy][i]=dis[t.x][t.y][t.num]+dd;
if(vis[xx][yy][i]==0)
{
q.push({xx,yy,i});
vis[xx][yy][i]=1;
}
}
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>s[i][j];
if(s[i][j]=='A')
{
lx=i;
ly=j;
}
if(s[i][j]=='B')
{
fx=i;
fy=j;
}
}
}
spfa();
int sum=0x3f3f3f3f;
for(int i=0;i<4;i++)
{
sum = min(sum,dis[fx][fy][i]);
}
if(sum==0x3f3f3f3f)
{
cout<<"-1";
}
else
{
cout<