一般用BFS都是为了求最短路,但实际上BFS是盲目搜寻法,起点到终点有多少条不同的路线也能搜到(没有vis[]标记),不仅仅是最短路(有vis标记)能被搜到
1.本题因为要搜多少条路径,所以不需要用vis数组标记是否访问过,可能会重复经过某个坐标
2.终点不需要入队,不需要从终点扩展,没有意义
上代码
#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
const int N=100;
int a,b,x,y;
int n;
typedef pair<int,int> PII;
int mapv[N][N]={0};
//bool vis[N][N];
int dx[2]={1,0};
int dy[2]={0,1};
int co;
void bfs(int x,int y)
{
queue<PII> q;
q.push({x,y});
//vis[1][1]=true;
while(!q.empty())
{
PII t=q.front();
q.pop();
for(int i=0;i<2;i++)
{
int xx=t.first+dx[i];
int yy=t.second+dy[i];
if(xx>=1&&xx<=a&&yy>=1&&yy<=b&&mapv[xx][yy]!=-1)
{
//vis[xx][yy]=true;
if(xx==a&&yy==b)
{
co++;
//终点不需要再继续扩展,不需要入队
continue;
}
q.push({xx,yy});
}
}
}
}
int main()
{
cin>>a>>b;
cin>>n;
while(n--)
{
cin>>x>>y;
mapv[x][y]=-1;
}
bfs(1,1);
cout<<co<<endl;
}