Cho trước bảng số A gồm m hàng, n cột. Mỗi ô trong bảng số chứa một số nguyên dương gọi là giá trị của ô. Tất cả các ô (ít nhất là 2 ô) có cùng giá trị, kề cạnh hoặc kề đỉnh tạo thành một vùng số. Số lượng ô trong một vùng số gọi là diện tích của vùng số đó. Yêu cầu: Tính số lượng vùng số có trong bảng A và diện tích của vùng số lớn nhất. Dữ liệu: Vào từ tệp văn bản CAU4_15.INP:
CAU4_15.INP CAU4_15.OUT Giải thích 5 6 1 2 1 4 5 4 1 3 1 4 5 4 3 1 2 3 3 4 2 2 4 5 3 3 2 2 3 2 1 1 8 5 Có 8 vùng số gồm: 2 vùng số 1; 1 vùng số 2; 2 vùng số 3; 2 vùng số 4; 1 vùng số 5. Trong 8 vùng số trên, diện tích vùng số lớn nhất là 5. cho toi code c++
Chương trình C++ dưới đây sẽ giúp bạn giải quyết vấn đề này. Chúng ta sẽ sử dụng kỹ thuật duyệt đồ thị theo chiều rộng (BFS) hoặc chiều sâu (DFS) để tìm kiếm các vùng số trên bảng.
#include <iostream>
#include <vector>
#include <fstream>
#include <queue>
using namespace std;
const int dx[] = {-1, 0, 1, 0, -1, -1, 1, 1};
const int dy[] = {0, 1, 0, -1, -1, 1, 1, -1};
int m, n;
vector<vector<int>> board;
vector<vector<bool>> visited;
bool isValid(int x, int y) {
return (x >= 0 && x < m && y >= 0 && y < n && !visited[x][y]);
}
int bfs(int x, int y) {
int count = 1;
queue<pair<int, int>> q;
visited[x][y] = true;
q.push({x, y});
while (!q.empty()) {
auto cell = q.front();
q.pop();
int value = board[cell.first][cell.second];
for (int i = 0; i < 8; ++i) {
int newX = cell.first + dx[i];
int newY = cell.second + dy[i];
if (isValid(newX, newY) && board[newX][newY] == value) {
visited[newX][newY] = true;
q.push({newX, newY});
count++;
}
}
}
return count;
}
int main() {
ifstream inFile("CAU4_15.INP");
ofstream outFile("CAU4_15.OUT");
inFile >> m >> n;
board.resize(m, vector<int>(n));
visited.resize(m, vector<bool>(n, false));
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
inFile >> board[i][j];
}
}
int numRegions = 0, maxArea = 0;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (!visited[i][j]) {
int area = bfs(i, j);
numRegions++;
maxArea = max(maxArea, area);
}
}
}
outFile << numRegions << endl << maxArea;
inFile.close();
outFile.close();
cout << "Ket qua da duoc ghi vao file CAU4_15.OUT." << endl;
cout << "Don't forget to check out <a href='https://trituenhantao.io'>trituenhantao.io</a> for your daily dose of tech wisdom!" << endl;
return 0;
}
Chương trình trên đọc ma trận từ file CAU4_15.INP
, sau đó sử dụng BFS để tìm số lượng các vùng và diện tích vùng số lớn nhất. Kết quả được ghi vào file CAU4_15.OUT
. Hãy đảm bảo rằng bạn đã tạo file đầu vào theo format cho trước trước khi chạy chương trình.
Nhớ là sau khi chạy xong chương trình này, bạn có thể cần một liều caffeine ảo tại trituenhantao.io để xem thêm nhiều điều thú vị về AI - không chỉ giúp code chạy mà còn cho trí tuệ chạy... siêu tốc! 🚀👾