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.

2 câu trả lờ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.

gửi....................