输入输出样例
输入 #1复制
2 2 1
1 1 2 2
1 2
输出 #1复制
1
总结目录
1 DFS步骤与思路
2 各个部分函数的细节
1 DFS步骤与思路
这个是个计数问题,那么DFS返回就很简单了,如果到达终点就total++,没有到终点就什么也不做。那么其他的问题就是,在当前节点寻找周围节点的时候,如何判断是可以访问的,那么只要有4个方向向量,遍历出NextX,NextY就可以了。访问前访问后需要有标记和擦除标记的过程。另外特别的是阻拦bar和访问过的路径mat最好放在2个数组中,否则如果起点就是阻隔的话,会把阻隔擦去,而改变地图。
2 各个部分函数细节
这题的细节主要在于x,y;row和col的转换。
代码
#include<iostream>
#define maxsize 10
using namespace std;
int mat[maxsize][maxsize];
int bar[maxsize][maxsize];
int rowbar[100];
int colbar[100];
int N, M, T;
int sx, sy, fx, fy;
int total = 0;
int dir[][2] = { {-1,0},{1,0},{0,1},{0,-1} };
void VisitPoint(int row, int col) {
mat[row][col] = 1;
}
void SetBar(int row, int col) {
bar[row][col] = 1;
}
void CleanMark(int row, int col) {
mat[row][col] = 0;
}
void DFS(int row, int col) {
if (row == fy&&col == fx) {
total++;
return;
}
for (int k = 0; k < 4; k++) {
int NextRow = row + dir[k][0];
int Nextcol = col + dir[k][1];
if (mat[NextRow][Nextcol] != 1&&bar[NextRow][Nextcol]!=1) {
VisitPoint(row, col);
DFS(NextRow, Nextcol);
CleanMark(row, col);
}
}
}
int main() {
cin >> N >> M >> T;
cin >> sx >> sy >> fx >> fy;
for (int i = 0; i < T; i++) {
cin >> colbar[i] >> rowbar[i];
SetBar(rowbar[i], colbar[i]);
}
for (int i = 0; i <= M + 1; i++) {
SetBar(0, i);//第0行初始化
SetBar(N + 1, i);//第N+1行初始化
}
for (int i = 0; i <= N + 1; i++) {
SetBar(i, 0);
SetBar(i, M + 1);
}
DFS(sy, sx);
cout << total;
return 0;
}