BCBOM spoj PTIT – Trò chơi dò mìn

Nguồn đề bài: http://www.spoj.com/PTIT/problems/BCBOM/

1. Đề bài BCBOM spoj PTIT

Trong trò chơi dò mìn, người ta cho trước một ma trận cấp n*m trong đó có một số quả mìn ở các vị trí nào đó. Nhiệm vụ của người chơi là xác định vị trí của các quả mìn này dựa trên các ô xung quanh.

Trong bài này, bạn hãy viết chương trình chuyển từ ma trận n*m mô tả vị trí các quả mìn và các ô trống thành một ma trận khác trong đó với mỗi ô trống sẽ xác định xem có bao nhiêu quả mìn kề với nó.

Input: Có nhiều bộ test, mỗi bộ test bắt đầu bằng 2 số nguyên n và m (1<=n,m<=100). Tiếp theo đó là ma trận cấp n*m trong đó vị trí có mìn đánh dấu bởi ký tự * còn không có là dấu chấm (.). Dòng cuối cùng của file Input chứa hai giá trị 0.

Output: Với mỗi bộ test, in ra  màn  hình  ma trận tương ứng trong đó các vị trí có dấu chấm được thay bằng một số nguyên cho biết số quả mìn kề với ô đó.

Example

Input:
3 2
..
.*
..
5 5
*.*.*
..*..
*****
…..
..**.
0 0

Output:
11
1*
11
*3*3*
36*63
*****
24553
01**1

2. Gợi ý BCBOM spoj PTIT

Bài này không có gì khó, chỉ việc đếm các ô xung quanh, chủ yếu bạn phải cẩn thận các bước khởi tạo cũng như cách duyệt sao cho hợp lí thôi.

3. code tham khảo BCBOM spoj PTIT

const   fi='';
        nmax=100;
type    data=longint;
var
        f:text;
        A,B:array[0..nmax+1,0..nmax+1] of char;
        n,m:data;
function dem(u,v:data):data;
var     i,j:data;
begin
        dem:=0;
        for i:=u-1 to u+1 do
                for j:=v-1 to v+ 1 do
                        if a[i,j]='*' then
                                inc(dem);
end;

procedure xuli;
var     i,j:data;
begin
        for i:=1 to m do
                for j:=1 to n do
                        if a[i,j]='.' then
                                b[i,j]:=chr(dem(i,j)+48)
                        else
                                b[i,j]:='*';
        for i:=1 to m do
                begin
                        for j:=1 to n do
                                write(b[i,j]);
                        writeln;
                end;
end;

procedure docfile;
var     i,j:data;
begin
        assign(f,fi); reset(f);
        repeat
                readln(f,m,n);
                if (m=0) and (n=0) then break;
                fillchar(a,sizeof(a),'.');

                for i:=1 to m do
                        begin
                                for j:=1 to n do
                                        read(f,a[i,j]);
                                readln(f);
                        end;
                xuli;
        until false;
        close(f);
end;

begin
        docfile;
end.

 

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *