TRÒ CHƠI Ô CHỮ
Một ô chữ được mô tả là một hình chữ nhật gồm ???? dòng, ???? cột. Một vài ô tự do và một số ô
bị khóa. Biết rằng một từ được điền vào ô chữ phải điền theo quy tắc sau:
Bước 1:
• Độ dài của một từ ít nhất là 3 kí tự (tức là cần tối thiểu 3 ô liên tiếp để điền được 1 từ)
– 3 ô này phải là ô tự do.
• Phải xác định được ô đầu của một từ (có thể theo chiều ngang hay dọc). Nếu một từ
điền theo chiều ngang thì ô đầu tiên của một từ hoặc là ô trái nhất của 1 hàng hoặc ô
bên trái của ô đó là một ô bị khóa. Nếu điền theo chiều dọc của ô chữ thì ô đầu của một
từ hoặc là ô đầu của một cột hoặc ô phía trên của ô đó là một ô bị khóa.
-3 -2 -1 0 1 2 3 4 5
Bước 2: Ta gán 1 cho mỗi ô là ô bắt đầu của một từ một số nguyên. Các ô này được gán các số
lần lượt bắt đầu từ 1 theo đúng trình tự: các ô được đọc lần lượt theo hàng: hàng 1, hàng 2,..
trên mỗi hàng lại đọc từ trái qua phải.. Chỉ các ô bắt đầu của một từ mới được đánh số.
Ví dụ: Quy ước tại 1 ô chứa dấu “.” là ô tự do, ô chứa “#” là ô bị khóa, nếu cho mô tả của một
ô chữ như sau:
…
#..
…
..#
.##
Khi đó, ở các ô chứa dấu “!” là ô có thể bắt đầu 1 từ:
!!!
#..
!..
..#
.##
Ta lần lượt đánh số các ô này theo quy ước ở bước 2:
123
#..
4..
..#
.##
Ở hàng thứ 2 không có từ nào cả vì độ dài không thỏa mãn.
Yêu cầu: Cho một mô tả ban đầu về ô chữ, hãy cho biết ô chữ đố có bao nhiêu từ và vị trí các
ô là ô đầu của mỗi từ theo mô tả ở trên
Dữ liệu: vào từ ile văn bản CROSSWORDS.INP
• Dòng đầu gồm 2 số n và m (????, ???? ≤ 50).
• ???? dòng tiếp theo, mỗi dòng gồm ???? kí tự “.” hoặc “#” mô tả ô ở vị trí tương ứng là ô tự
do hay ô bị khóa.
Kết quả: Ghi ra file văn bản CROSSWORD.OUT:
• Dòng đầu là số lượng các từ có thể của ô chữ.
• Mỗi dòng tiếp theo ghi 2 số là chỉ số hàng và cột của ô đầu của mỗi từ theo quy tắc
điền từ ở trên.
gửi………………..
const fi=’crossword.inp’;
fo=’crossrord.out’;
maxn=50;
var board:array[0..maxn,0..maxn] of byte;
kq:array[1..maxn,1..maxn] of byte;
i,j:longint;
n,m:longint;
x:char;
procedure nhap;
var i:longint;
begin
fillchar(kq,sizeof(kq),0);
assign(input,fi);
assign(output,fo);
reset(input);
rewrite(output);
fillchar(board,sizeof(board),1);
readln(n,m);
for i:=1 to n do
Begin
for j:=1 to m do
Begin
read(x);
if x=’.’ then board[i,j]:=0;
end;
readln;
end;
end;
procedure xuli;
var i,j,dem,t,u:longint;
Begin
for i:=1 to n do
for j:=1 to m do
begin
if board[i,j-1]=1 then
if board[i,j]+board[i,j+1]+board[i,j+2]=0 then
kq[i,j]:=1;
if board[i-1,j]=1 then
if board[i,j]+board[i+1,j]+board[i+2,j]=0 then
kq[i,j]:=1;
end;
dem:=0;
for t:=1 to n do
for u:=1 to m do
if kq[t,u]=1 then
inc(dem);
writeln(dem);
for t:=1 to n do
for u:=1 to m do
if kq[t,u]=1 then
writeln(t,’ ‘,u);
close(input);
close(output);
end;
begin
nhap;
xuli;
end.