Bài tập đếm sao

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

Nhìn thuật toán thì có vẻ không sai. Bạn có thể show một testcase nào mà bạn thấy output không đúng không?

Khả năng cao là do cách đọc input chưa đúng.
Input data kết thúc bằng gì? Tại sao bạn lại dùng “SIGINT”?

2 Likes

Dạ SIGINT em dùng để test trên visual studio thôi anh : D. Em submit trên hệ thống dùng process.stdin.on(‘end’). Mà chắc test case không khớp r

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?