跟踪系统利用雷达扫描周围空间,扫描结果表示为 NxM 的矩阵。如果在相应的位置没有
障碍物,则矩阵的元素为 0;若有,则为 1。矩阵保存在一个文件中,文件名由用户输入。
矩阵大小由#define 预先定义。矩阵中每个元素都由空格分隔。
编一个程序,读取矩阵。并且
1.计算水平方向上的最长屏障, 即返回矩阵中水平方向
上,1 连续出现次数最多的位置和相应长度;
2.同样计算竖直方向上的最长屏障, 即
返回矩阵中竖直方向上,1 连续出现次数最多的位置和相应长度;
3. 计算正对角方向上
的最长屏障,即返回矩阵中正对角方向上,
1 连续出现次数最多的位置和相应长度;
4. 计
算逆对角方向上的最长屏障,即返回矩阵中逆对角方向上,1 连续出现次数最多的位置
和相应长度;
5.判定这 4 个最长屏障有无共用元素。
如果出现长度相同的, 则选择最后一个作为结果。
(这两天就需要)
#include <iostream>
#include <fstream>
#include <vector>
#define N 5 // 矩阵大小
// 计算水平方向上的最长屏障
std::pair<int, int> calculateHorizontalBarrier(const std::vector<std::vector<int>>& matrix) {
int max_length = 0;
int max_index = -1;
int current_length = 0;
int current_index = -1;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (matrix[i][j] == 1) {
if (current_index == -1) {
current_index = i;
}
current_length++;
}
else {
if (current_length > max_length) {
max_length = current_length;
max_index = current_index;
}
current_length = 0;
current_index = -1;
}
}
}
if (current_length > max_length) {
max_length = current_length;
max_index = current_index;
}
return std::make_pair(max_index, max_length);
}
// 计算竖直方向上的最长屏障
std::pair<int, int> calculateVerticalBarrier(const std::vector<std::vector<int>>& matrix) {
int max_length = 0;
int max_index = -1;
int current_length = 0;
int current_index = -1;
for (int j = 0; j < N; j++) {
for (int i = 0; i < N; i++) {
if (matrix[i][j] == 1) {
if (current_index == -1) {
current_index = j;
}
current_length++;
}
else {
if (current_length > max_length) {
max_length = current_length;
max_index = current_index;
}
current_length = 0;
current_index = -1;
}
}
}
if (current_length > max_length) {
max_length = current_length;
max_index = current_index;
}
return std::make_pair(max_index, max_length);
}
// 计算正对角方向上的最长屏障
std::pair<int, int> calculateDiagonalBarrier(const std::vector<std::vector<int>>& matrix) {
int max_length = 0;
int max_index = -1;
int current_length = 0;
int current_index = -1;
for (int k = 0; k < N; k++) {
for (int i = 0; i < N - k; i++) {
int j = i + k;
if (matrix[i][j] == 1) {
if (current_index == -1) {
current_index = i;
}
current_length++;
}
else {
if (current_length > max_length) {
max_length = current_length;
max_index = current_index;
}
current_length = 0;
current_index = -1;
}
}
}
if (current_length > max_length) {
max_length = current_length;
max_index = current_index;
}
return std::make_pair(max_index, max_length);
}
// 计算逆对角方向上的最长屏障
std::pair<int, int> calculateInverseDiagonalBarrier(const std::vector<std::vector<int>>& matrix) {
int max_length = 0;
int max_index = -1;
int current_length = 0;
int current_index = -1;
for (int k = 0; k < N; k++) {
for (int i = 0; i < N - k; i++) {
int j = N - 1 - i - k;
if (matrix[i][j] == 1) {
if (current_index == -1) {
current_index = i;
}
current_length++;
}
else {
if (current_length > max_length) {
max_length = current_length;
max_index = current_index;
}
current_length = 0;
current_index = -1;
}
}
}
if (current_length > max_length) {
max_length = current_length;
max_index = current_index;
}
return std::make_pair(max_index, max_length);
}
int main() {
std::vector<std::vector<int>> matrix(N, std::vector<int>(N, 0));
// 从文件中读取矩阵
std::string filename;
std::cout << "请输入包含矩阵的文件名:";
std::cin >> filename;
std::ifstream file(filename);
if (file.is_open()) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
file >> matrix[i][j];
}
}
file.close();
}
else {
std::cout << "无法打开文件!" << std::endl;
return 0;
}
// 计算水平方向上的最长屏障
std::pair<int, int> horizontalBarrier = calculateHorizontalBarrier(matrix);
std::cout << "水平方向上的最长屏障位置:" << horizontalBarrier.first << std::endl;
std::cout << "水平方向上的最长屏障长度:" << horizontalBarrier.second << std::endl;
// 计算竖直方向上的最长屏障
std::pair<int, int> verticalBarrier = calculateVerticalBarrier(matrix);
std::cout << "竖直方向上的最长屏障位置:" << verticalBarrier.first << std::endl;
std::cout << "竖直方向上的最长屏障长度:" << verticalBarrier.second << std::endl;
// 计算正对角方向上的最长屏障
std::pair<int, int> diagonalBarrier = calculateDiagonalBarrier(matrix);
std::cout << "正对角方向上的最长屏障位置:" << diagonalBarrier.first << std::endl;
std::cout << "正对角方向上的最长屏障长度:" << diagonalBarrier.second << std::endl;
// 计算逆对角方向上的最长屏障
std::pair<int, int> inverseDiagonalBarrier = calculateInverseDiagonalBarrier(matrix);
std::cout << "逆对角方向上的最长屏障位置:" << inverseDiagonalBarrier.first << std::endl;
std::cout << "逆对角方向上的最长屏障长度:" << inverseDiagonalBarrier.second << std::endl;
// 判断4个最长屏障是否有共用元素
if (horizontalBarrier.second == verticalBarrier.second &&
horizontalBarrier.second == diagonalBarrier.second && horizontalBarrier.second == inverseDiagonalBarrier.second) {
std::cout << "4个最长屏障有共用元素" << std::endl;
}
else {
std::cout << "4个最长屏障没有共用元素" << std::endl;
}
return 0;
}
基于new bing部分指引作答:
下面是一个使用C++编写的程序,用于读取矩阵并计算水平、垂直、正对角线和逆对角线方向上的最长屏障,并判断它们是否存在共用元素。请注意,此处假设矩阵大小由预定义常量N和M指定。
#include <iostream>
#include <fstream>
#define N 3
#define M 4
void readMatrix(int matrix[N][M], const std::string& fileName) {
std::ifstream inputFile(fileName);
if (inputFile.is_open()) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
inputFile >> matrix[i][j];
}
}
inputFile.close();
} else {
std::cout << "Failed to open file: " << fileName << std::endl;
}
}
void findLongestBarrier(int matrix[N][M], int& startRow, int& startCol, int& length, bool horizontal) {
int maxLength = 0;
int maxLengthStartRow = -1;
int maxLengthStartCol = -1;
for (int i = 0; i < N; i++) {
int currentLength = 0;
for (int j = 0; j < M; j++) {
int row = (horizontal) ? i : j;
int col = (horizontal) ? j : i;
if (matrix[row][col] == 1) {
currentLength++;
if (currentLength > maxLength) {
maxLength = currentLength;
maxLengthStartRow = row - maxLength + 1;
maxLengthStartCol = col - maxLength + 1;
}
} else {
currentLength = 0;
}
}
}
startRow = maxLengthStartRow;
startCol = maxLengthStartCol;
length = maxLength;
}
bool checkOverlap(int matrix[N][M], int row, int col, int length) {
for (int i = row; i < row + length; i++) {
for (int j = col; j < col + length; j++) {
if (matrix[i][j] == 1) {
return true;
}
}
}
return false;
}
int main() {
int matrix[N][M];
// Read matrix from file
std::string fileName;
std::cout << "Enter file name: ";
std::cin >> fileName;
readMatrix(matrix, fileName);
// Calculate longest barriers
int horizontalStartRow, horizontalStartCol, horizontalLength;
findLongestBarrier(matrix, horizontalStartRow, horizontalStartCol, horizontalLength, true);
int verticalStartRow, verticalStartCol, verticalLength;
findLongestBarrier(matrix, verticalStartRow, verticalStartCol, verticalLength, false);
int diagonalStartRow, diagonalStartCol, diagonalLength;
findLongestBarrier(matrix, diagonalStartRow, diagonalStartCol, diagonalLength, true);
int antiDiagonalStartRow, antiDiagonalStartCol, antiDiagonalLength;
findLongestBarrier(matrix, antiDiagonalStartRow, antiDiagonalStartCol, antiDiagonalLength, false);
// Check for overlap
bool overlap = false;
overlap = overlap || checkOverlap(matrix, horizontalStartRow, horizontalStartCol, horizontalLength);
overlap = overlap || checkOverlap(matrix, verticalStartRow, verticalStartCol, verticalLength);
overlap = overlap || checkOverlap(matrix, diagonalStartRow, diagonalStartCol, diagonalLength);
overlap = overlap || checkOverlap(matrix, antiDiagonalStartRow, antiDiagonalStartCol, antiDiagonalLength);
// Output results
std::cout << "Horizontal barrier: Start=(" << horizontalStartRow << ", " << horizontalStartCol
<< "), Length=" << horizontalLength << std::endl;
std::cout << "Vertical barrier: Start=(" << verticalStartRow << ", " << verticalStartCol
<< "), Length=" << verticalLength << std::endl;
std::cout << "Diagonal barrier: Start=(" << diagonalStartRow << ", " << diagonalStartCol
<< "), Length=" << diagonalLength << std::endl;
std::cout << "Anti-diagonal barrier: Start=(" << antiDiagonalStartRow << ", " << antiDiagonalStartCol
<< "), Length=" << antiDiagonalLength << std::endl;
if (overlap) {
std::cout << "The barriers have overlapping elements." << std::endl;
} else {
std::cout << "The barriers do not have overlapping elements." << std::endl;
}
return 0;
}
上述代码假定输入文件中的矩阵大小与预定义常量N和M匹配。在运行代码之前,确保输入文件的格式正确,并且输入的矩阵大小与N和M一致。
以下是一个C++编程示例,实现了你描述的功能。程序首先读取包含矩阵数据的文件,并将其存储在一个二维数组中。然后,程序计算水平、竖直、正对角和逆对角方向上的最长屏障,并判断它们是否有共用元素。
#include <iostream>
#include <fstream>
#include <vector>
#define MATRIX_SIZE 10 // 定义矩阵大小
// 函数声明
void readMatrixFromFile(const std::string& fileName, std::vector<std::vector<int>>& matrix);
std::pair<int, int> findLongestBarrier(const std::vector<std::vector<int>>& matrix, const int direction);
bool checkIfShared(const std::vector<std::vector<int>>& matrix, const std::pair<int, int>& barrier1, const std::pair<int, int>& barrier2);
int main() {
std::string fileName;
std::cout << "请输入包含矩阵数据的文件名:";
std::cin >> fileName;
std::vector<std::vector<int>> matrix;
readMatrixFromFile(fileName, matrix);
std::pair<int, int> horizontalBarrier = findLongestBarrier(matrix, 0);
std::pair<int, int> verticalBarrier = findLongestBarrier(matrix, 1);
std::pair<int, int> diagonalBarrier = findLongestBarrier(matrix, 2);
std::pair<int, int> antiDiagonalBarrier = findLongestBarrier(matrix, 3);
std::cout << "水平方向上的最长屏障:" << horizontalBarrier.first << ",长度:" << horizontalBarrier.second << std::endl;
std::cout << "竖直方向上的最长屏障:" << verticalBarrier.first << ",长度:" << verticalBarrier.second << std::endl;
std::cout << "正对角方向上的最长屏障:" << diagonalBarrier.first << ",长度:" << diagonalBarrier.second << std::endl;
std::cout << "逆对角方向上的最长屏障:" << antiDiagonalBarrier.first << ",长度:" << antiDiagonalBarrier.second << std::endl;
if (checkIfShared(matrix, horizontalBarrier, verticalBarrier))
std::cout << "水平方向上的最长屏障和竖直方向上的最长屏障有共用元素。" << std::endl;
else if (checkIfShared(matrix, horizontalBarrier, diagonalBarrier))
std::cout << "水平方向上的最长屏障和正对角方向上的最长屏障有共用元素。" << std::endl;
else if (checkIfShared(matrix, horizontalBarrier, antiDiagonalBarrier))
std::cout << "水平方向上的最长屏障和逆对角方向上的最长屏障有共用元素。" << std::endl;
else if (checkIfShared(matrix, verticalBarrier, diagonalBarrier))
std::cout << "竖直方向上的最长屏障和正对角方向上的最长屏障有共用元素。" << std::endl;
else if (checkIfShared(matrix, verticalBarrier, antiDiagonalBarrier))
std::cout << "竖直方向上的最长屏障和逆对角方向上的最长屏障有共用元素。" << std::endl;
else if (checkIfShared(matrix, diagonalBarrier, antiDiagonalBarrier))
std::cout << "正对角方向上的最长屏障和逆对角方向上的最长屏障有共用元素。" << std::endl;
else
std::cout << "这4个最长屏障没有共用元素。" << std::endl;
return 0;
}
// 从文件中读取矩阵数据
void readMatrixFromFile(const std::string& fileName, std::vector<std::vector<int>>& matrix) {
std::ifstream file(fileName);
if (file.is_open()) {
matrix.resize(MATRIX_SIZE, std::vector<int>(MATRIX_SIZE));
for (int i = 0; i < MATRIX_SIZE; ++i) {
for (int j = 0; j < MATRIX_SIZE; ++j) {
file >> matrix[i][j];
}
}
file.close();
} else {
std::cerr << "无法打开文件:" << fileName << std::endl;
}
}
// 查找指定方向上的最长屏障
std::pair<int, int> findLongestBarrier(const std::vector<std::vector<int>>& matrix, const int direction) {
int maxBarrierIndex = -1;
int maxBarrierLength = 0;
switch (direction) {
case 0: // 水平方向
for (int i = 0; i < MATRIX_SIZE; ++i) {
int currentBarrierLength = 0;
for (int j = 0; j < MATRIX_SIZE; ++j) {
if (matrix[i][j] == 1)
currentBarrierLength++;
else
currentBarrierLength = 0;
if (currentBarrierLength > maxBarrierLength) {
maxBarrierLength = currentBarrierLength;
maxBarrierIndex = i;
}
}
}
break;
case 1: // 竖直方向
for (int j = 0; j < MATRIX_SIZE; ++j) {
int currentBarrierLength = 0;
for (int i = 0; i < MATRIX_SIZE; ++i) {
if (matrix[i][j] == 1)
currentBarrierLength++;
else
currentBarrierLength = 0;
if (currentBarrierLength > maxBarrierLength) {
maxBarrierLength = currentBarrierLength;
maxBarrierIndex = j;
}
}
}
break;
case 2: // 正对角方向
for (int k = 0; k < MATRIX_SIZE; ++k) {
int i = 0;
int j = k;
int currentBarrierLength = 0;
while (i < MATRIX_SIZE && j < MATRIX_SIZE) {
if (matrix[i][j] == 1)
currentBarrierLength++;
else
currentBarrierLength = 0;
if (currentBarrierLength > maxBarrierLength) {
maxBarrierLength = currentBarrierLength;
maxBarrierIndex = k;
}
i++;
j++;
}
}
break;
case 3: // 逆对角方向
for (int k = 0; k < MATRIX_SIZE; ++k) {
int i
按照四个输出要求的方向,for循环判断记录最长的长度和元素,先输出前四个。第五个输出用计数法判断一下有没有元素为4就行了。代码逻辑不复杂,行数可能有点多但都属于基础代码,上课稍微认真一点就会的东西。