题目描述
给定一个N*M(1≤N,M≤5)方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。
输入输出格式
输入格式:
第一行N、M和T,N为行,M为列,T为障碍总数。第二行起点坐标SX,SY,终点坐标FX,FY。接下来T行,每行为障碍点的坐标。
输出格式:
给定起点坐标和终点坐标,问每个方格最多经过1次,从起点坐标到终点坐标的方案总数。
输入输出样例
输入样例#1:
2 2 1
1 1 2 2
1 2
输出样例#1:
1
————————————————
思路:深搜
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
const int maxn = 100;
int map[maxn][maxn];
bool book[maxn][maxn];
int dx[4] = {0,0,1,-1};
int dy[4] = {-1,1,0,0};
int ans,fx,fy,sx,sy,T,m,n,r,c;
void dfs(int x,int y)
{
if(x == fx && y == fy)
{
ans++;
return;
}else
{
for(int i = 0; i <= 3;i++ )
{
if(book[x+dx[i]][y+dy[i]] == 0 && map[x + dx[i]][y+dy[i]] == 1)
{
book[x][y] = 1;
dfs(x+dx[i],y+dy[i]);
book[x][y] = 0;
}
}
}
}
int main(){
scanf("%d %d %d",&n,&m,&T);
for(int ii = 1;ii <= n; ii++)
for(int jj = 1;jj <= m; jj++)
map[ii][jj] = 1;
scanf("%d %d",&sx,&sy);
scanf("%d %d",&fx,&fy);
for(int k = 1; k <= T;k++)
{
scanf("%d %d",&r,&c);
map[r][c] = 0;
}
dfs(sx,sy);
printf("%d\n",ans);
return 0;
}