题目描述:
题目解读:
存在矩阵迷宫n×m,(r,c)表示从顶部开始的第r行和左起第c列。
如果两单元格共享一个边,则是相邻的。路径是相邻空单元格的序列。
每个单元格初始状态都为空。对于从(x1,y1)到(x2,y2),李华可以选择一些单元格(非(x1,y1),(x2,y2))设置一些障碍物,使得没有路径可以从(x1,y1)到(x2,y2)。
求放置障碍物的最小个数。
输入迷宫大小,以及(x1,y1),(x2,y2)的值。
输出障碍物的最小个数。
解题思路:
想要阻止(5,1)到(3,6)只需要将(5,1)围困起来即可,围堵(3,6)耗费障碍数太多。
比如(1,1)到(3,2),显然围困(1,1)符合要求,围困(3,2)耗费不是最小。
所以要求最小障碍数,其实把起点或者终点围困起来即可。
然后需要先根据矩阵迷宫大小,判断起终点哪一个被围困所耗费障碍数最小。
(如果矩阵够小,比如2x2矩阵,(1,1)到(2,2)就只需要一个障碍,但是题目所给矩阵行列数大于4,不用考虑该特殊情况)
点的横纵坐标都贴边,围堵该点的最小障碍数为2;
横纵坐标有一个贴边,围堵该点的最小障碍数为3;
横纵坐标都不贴边,围堵该点的最小障碍数为4。
比较围堵两点各自所需的障碍数,输出最小值即为所求。
代码实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>int Result(int a, int b,int n,int m) { //a,b为横纵坐标,n,m为矩阵大小if (a == 1 && b == 1 || a == n && b == 1 || a == 1 && b == m || a == n && b == m) {//点在四个角上return 2;}else if (a == 1 || b == 1 || a == n || b == m) {return 3;}else return 4;
}void Solve() {int n,m; scanf("%d%d", &n, &m);int x1, x2, y1, y2;scanf("%d%d%d%d", &x1, &y1, &x2, &y2);printf("%d\n", Result(x1, y1, n, m) < Result(x2, y2, n, m) ? Result(x1, y1, n, m) : Result(x2, y2, n, m));return;
}int main() {int t;scanf("%d", &t);while (t--) Solve();return 0;
}
遇到的错误: