Khoa học tiên tiến đã nảy sinh ra yêu cầu dùng máy tính để tự động phân tích ảnh chụp của các siêu viễn vọng kính nhằm phát hiện ra những vì tinh tú mới. Lý do cho nhu cầu này đơn giản là vì trên trời triệu triệu vì sao, đếm hoài đếm mải con người bó tay rồi, không đếm nổi.
Các bạn hãy viết một chương trình nhận vào ảnh chụp của viễn vọng kính, ảnh này đã được xử lý đưa về dạng đen trắng. Điểm ảnh màu đen biểu diễn bằng ký tự # và điểm ảnh màu trắng biểu diễn bằng ký tự -
Vùng màu đen trên ảnh là vũ trụ bao la rộng lớn còn vùng màu trắng chính là các ngôi sao. Một ngôi sao tùy kích thước to nhỏ có thể chiếm một điểm ảnh hoặc là nhiều điểm ảnh liền kê nhau theo đường ngang hoặc đường dọc (không tính đường chéo).
Input
Mỗi test case bắt đầu bằng một hàng chứa hai con số 1≤ m , n ≤100. Sau đó là m hàng, mỗi hàng chứa n điểm ảnh
Output
Ứng với mỗi test case, xuất ra số ngôi sao có trên ảnh theo ví dụ sau:
10 20
#################---
##-###############--
#---################
##-#################
########---#########
#######-----########
########---#########
##################--
#################---
##################-#
3 10
#-########
----------
#-########
Case 1: 4
Case 2: 1
Giúp em bài này với ạ. Mới động được javascript 2 ngày luôn : D.
process.stdin.resume();
process.stdin.setEncoding('utf8');
var input = ''
var visited = new Set()
var n, m
function At(i, j, arr) {
if (i == n || i < 0)
return '#'
else if (j == m || j < 0)
return '#'
else
return arr[i][j]
}
function Str(i, j) {
return i + " " + j
}
function dfs(i, j, arr) {
if (At(i, j, arr) != '-')
return
visited.add(i + " " + j)
if (At(i + 1, j, arr) == '-' && !visited.has(Str(i + 1, j))) {
dfs(i + 1, j, arr)
}
if (At(i - 1, j, arr) == '-' && visited.has(Str(i - 1, j))) {
dfs(i - 1, j, arr)
}
if (At(i, j + 1, arr) == '-' && !visited.has(Str(i, j + 1))) {
dfs(i, j + 1, arr)
}
if (At(i, j - 1, arr) == '-' && !visited.has(Str(i, j - 1))) {
dfs(i, j - 1, arr)
}
}
process.stdin.on("data", data => {
input += data;
})
process.on("SIGINT", () => {
input = input.split('\n');
let next_test_case = 0
let case_id = 1
while (true) {
let checker = input[next_test_case]
if (typeof checker == 'undefined' || checker === "")
break;
let n_and_m = checker.split(' ')
n = +n_and_m[0]
m = +n_and_m[1]
next_test_case++
let arr = []
for (let j = next_test_case; j < next_test_case + n; j++) {
arr.push(input[j].split(''))
}
let cnt = 0
for (let i = 0; i < n; i++) {
for (let j = 0; j < m; j++) {
if (arr[i][j] == '-' && !visited.has(Str(i, j))) {
dfs(i, j, arr)
cnt++
}
}
}
console.log("Case " + case_id + ": " + cnt)
visited.clear()
next_test_case += n
case_id++
}
})
process.on('uncaughtException', function (exception) {
console.log(exception);
console.log("rwe")
});
Em dùng dfs để check khoảng có ảnh rồi đếm. Không hiểu sao lại sai