Problem:迷宫搜索再加强版

it2022-05-05  133

Problem:迷宫搜索再加强版

Description

正所谓,“怕什么真理无穷,进一寸,有一寸的欢喜” 现在你已不满足于判断一个点能否走到另一个点了。 你希望知道从一个点到另一个点,用T秒的时间有多少种方式。

Input

第1行: 3个用空格隔开的整数:N,M,T 第2…N+1行: 第i+1行为M个连续的字符,描述了迷宫第i行各点的情况, 保证字符是’.‘和’‘中的一个,’.‘表示可通过的点,’'表示不可走的点 第N+2行: 4个用空格隔开的整数:R1,C1,R2,以及C2

Output

第1行: 输出S,含义如题中所述

Sample Input

4 5 6

…*.

…*.

1 3 1 5

Sample Output

1 //用6秒从(1,3)走到(1,5)的方法只有一种

这道题花花的想法是运用bfs搜索,如果符合条件ans就++,听起来十分简单,其实也很简单 (假装),所以我们根据题目可以得到这需要一个三维数组,是不是很棒棒 ,网友:。。。.所以开始吧:

#include<bits/stdc++.h>//可爱的万能头 using namespace std; int dp[111][111][18];//三维数组分别为n,m,t的存储对象 int vis[111][111][18]; int xx[4]={0,1,0,-1};//上下左右 int yy[4]={1,0,-1,0};//同上 int T;//时间 struct P { int x,y,num;//存储坐标和次数 }; queue<P> q;//队列存储 int sx,sy,ex,ey,n,m;//起点和终点 char s[111][111]; bool inside(int x,int y) { if(x<0||x>=n||y<0||y>=m||s[x][y]=='*') return false; else return true;//判断是否出界也可以return 1<x&&x<=n&&1<y&&y<=m; } void bfs() { P tt;//结构体 tt.x=sx; tt.y=sy; tt.num=0; q.push(tt); vis[sx][sy][0]=1;//打标 dp[sx][sy][0]=1; while(!q.empty())//判断是否为空 { P tmp=q.front(); q.pop();//删除 if(tmp.num>T) break; for(int i=0;i<4;i++) { int tx=xx[i]+tmp.x;//四个方向搜索 int ty=yy[i]+tmp.y; int tz=tmp.num+1; if(inside(tx,ty))//是否超界 { dp[tx][ty][tz]+=dp[tmp.x][tmp.y][tmp.num]; if(!vis[tx][ty][tz])//是否符合 { P tt; tt.x=tx; tt.y=ty; tt.num=tz; q.push(tt); vis[tx][ty][tz]=1; } } } } cout<<dp[ex][ey][T]<<endl; } int main() { cin>>n>>m>>T; for(int i=0;i<n;i++) cin>>s[i];//输入 cin>>sx>>sy>>ex>>ey; sx--;sy--;ex--;ey--; bfs(); return 0;//完美完结 }

大家都懂:

#include<bits/stdc++.h> using namespace std; int dp[111][111][18]; int vis[111][111][18]; int xx[4]={0,1,0,-1}; int yy[4]={1,0,-1,0}; int T; struct P { int x,y,num; }; queue<P> q; int sx,sy,ex,ey,n,m; char s[111][111]; bool inside(int x,int y) { if(x<0||x>=n||y<0||y>=m||s[x][y]=='*') return false; else return true; } void bfs() { P tt; tt.x=sx; tt.y=sy; tt.num=0; q.push(tt); vis[sx][sy][0]=1; dp[sx][sy][0]=1; while(!q.empty()) { P tmp=q.front(); q.pop(); if(tmp.num>T) break; for(int i=0;i<4;i++) { int tx=xx[i]+tmp.x; int ty=yy[i]+tmp.y; int tz=tmp.num+1; if(inside(tx,ty)) { dp[tx][ty][tz]+=dp[tmp.x][tmp.y][tmp.num]; if(!vis[tx][ty][tz]) { P tt; tt.x=tx; tt.y=ty; tt.num=tz; q.push(tt); vis[tx][ty][tz]=1; } } } } cout<<dp[ex][ey][T]<<endl; } int main() { cin>>n>>m>>T; for(int i=0;i<n;i++) cin>>s[i]; cin>>sx>>sy>>ex>>ey; sx--;sy--;ex--;ey--; bfs(); return 0; }

蟹蟹大家支持!!! 记得点赞!!!!


最新回复(0)