传送门
本题将提供两种解决办法
无脑开暴力
数据过小,深搜也能过(这题标签就是深搜啊)
四种情况:
- 上和右无障碍
- 上有障碍
- 右有障碍
- 上和右皆有障碍
对应的四种走法:
- 向上或向右
- 向右
- 向上
- 被堵了,走不了
dfs:
void dfs(int x,int y){
if(x<1||x>n||y<1||y>m||map[x][y]||vis[x][y]) return;
if(x==n&&y==m){
cnt++;
return;
}
vis[x][y]=1;//标记一下
dfs(x+1,y); //向上或向右
dfs(x,y+1);
vis[x][y]=0; //搜索完,将目前位置恢复原样
}
A C AC AC C O D E : CODE: CODE:
#include<cstdio>
#include<iostream>
using namespace std;
int n,m,t,cnt,vis[21][21];
bool map[21][21];
void dfs(int x,int y){
if(x<1||x>n||y<1||y>m||map[x][y]||vis[x][y]) return;
if(x==n&&y==m){
cnt++;
return;
}
vis[x][y]=1;
dfs(x+1,y);
dfs(x,y+1);
vis[x][y]=0;
}
int main(){
cin>>n>>m>>t;
while(t--){
int x,y;
cin>>x>>y;
map[x][y]=1;
}
dfs(1,1);
printf("%d",cnt);
return 0;
}
复杂度(最坏情况):O(a^b)
不建议使用(听说可以用dp做)
数学
不难发现,我们在图上多做几个“终点”,就是这样一张图:
也就是说,我们得到这样一个公式: m a p [ x ] [ y ] = m a p [ x − 1 ] [ y ] + m a p [ x ] [ y + 1 ] map[x][y]=map[x-1][y]+map[x][y+1] map[x][y]=map[x−1][y]+map[x][y+1]
当然,下和左的边复制都是1,注意的是:如果边上有障碍,那么这条边过去就不用赋值了,代码如下:
for(int i=1;i<=a;i++){
if(flag[i][1]) break;//如果该点为障碍点,那么退出循环
mapp[i][1]=1;//该点赋值为1
}
for(int i=1;i<=b;i++){
if(flag[1][i]) break;//如果该点为障碍点,那么退出循环
mapp[1][i]=1;//该点赋值为1
}
再将公式套进去:
for(int i=2;i<=a;i++){
for(int j=2;j<=b;j++){
if(!flag[i][j]){
mapp[i][j]=mapp[i-1][j]+mapp[i][j-1];
}
}
}
最后输出 m a p [ a ] [ b ] map[a][b] map[a][b]
A C AC AC C O D E : CODE: CODE:
#include<bits/stdc++.h>
using namespace std;
int a,b,n,x,y;
int mapp[20][20];//记录每个点的值
bool flag[20][20]={
0};//记录每个点是否为障碍点
int main()
{
scanf("%d%d%d",&a,&b,&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&x,&y);
flag[x][y]=1;//标记为障碍点
}
for(int i=1;i<=a;i++){
if(flag[i][1]) break;//如果该点为障碍点,那么退出循环
mapp[i][1]=1;//该点赋值为1
}
for(int i=1;i<=b;i++){
if(flag[1][i]) break;//如果该点为障碍点,那么退出循环
mapp[1][i]=1;//该点赋值为1
}
for(int i=2;i<=a;i++){
for(int j=2;j<=b;j++){
if(!flag[i][j]){
mapp[i][j]=mapp[i-1][j]+mapp[i][j-1];
}
}
}
printf("%d\n",mapp[a][b]);
return 0;
}
复杂度(最坏情况): O ( l o g a O(loga O(loga l o g b ) logb) logb)
az
z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z