Bàn cờ - Bài thi trích trong đề thi cấp quốc gia

C

cuong276

[TẶNG BẠN] TRỌN BỘ Bí kíp học tốt 08 môn
Chắc suất Đại học top - Giữ chỗ ngay!!

ĐĂNG BÀI NGAY để cùng trao đổi với các thành viên siêu nhiệt tình & dễ thương trên diễn đàn.

Cho 1 bàn cờ vuông 8*8 trên đó cho trước 1 số quân cờ.
Dữ liệu nhập được ghi trên tệp văn bản BANCO.TXT bao gồm 8 dòng, mỗi dòng là 1 xâu nhị phân độ dài 8. Vị trí các quan cờ ứng vơi số 1, các ô trống ứng với số 0
Ví dụ:
Tệp BANCO.TXT:
01010100
10011001
10100011
00010100
00100000
01010001
10011000
01000110
Hãy viết chương trình PASCAL tính số quan cờ liên tục lớn nhất nằm trên 1 đường thẳng. Đường thẳng này có thể là đường thẳng đứng, đường thẳng nằm ngang hoặc đường chéo. Kết quả thể hiện ra màn hình.
Lưu ý: Sau khi giải xong thì nhờ các bạn giải thích kĩ thuật toán nha.
 
Q

quanghero100

Mã:
uses crt;
var a,b:array[0..9,0..9] of char;
    s:string;
    i,j:byte;
    f:text;

procedure docfile;
begin
 assign(f,'BANCO.TXT');
 reset(f);
 for i:=1 to 8 do
    begin
       readln(f,s);
       for j:=1 to 8 do
         a[i,j]:=s[j];
    end;
 close(f);
end;

function hang(x,y:byte):integer;
var dem,x1,y1:integer;
begin
   dem:=0;
   if b[x,y]='1' then
     begin
        dem:=1;
        x1:=x;
        y1:=y;
        repeat
            inc(y1);
            if b[x1,y1]='1' then inc(dem);
        until (b[x1,y1]='0') or (y1>=9);
        y1:=y;
        repeat
            dec(y1);
            if b[x1,y1]='1' then inc(dem);
        until (b[x1,y1]='0') or (y1<=1);
     end;
   hang:=dem;
end;

function cot(x,y:byte):integer;
var dem,x1,y1:integer;
begin
   dem:=0;
   if b[x,y]='1' then
     begin
        dem:=1;
        x1:=x;
        y1:=y;
        repeat
            inc(x1);
            if b[x1,y1]='1' then inc(dem);
        until (b[x1,y1]='0') or (x1>=9);
        x1:=x;
        repeat
            dec(x1);
            if b[x1,y1]='1' then inc(dem);
        until (b[x1,y1]='0') or (x1<=1);
     end;
   cot:=dem;
end;

function cheo1(x,y:byte):integer;
var dem,x1,y1:integer;
begin
  dem:=0;
  if b[x,y]='1' then
    begin
       dem:=1;
       x1:=x;
       y1:=y;
       repeat
           dec(x1);
           inc(y1);
           if b[x1,y1]='1' then inc(dem);
       until (b[x1,y1]='0') or (x1<=1) or (y1>=9);
       x1:=x;
       y1:=y;
       repeat
           inc(x1);
           dec(y1);
           if b[x1,y1]='1' then inc(dem);
       until (b[x1,y1]='0') or (x1>=9) or (y1<=1);
    end;
  cheo1:=dem;
end;

function cheo2(x,y:byte):integer;
var dem,x1,y1:integer;
begin
  dem:=0;
  if b[x,y]='1' then
    begin
       dem:=1;
       x1:=x;
       y1:=y;
       repeat
           inc(x1);
           inc(y1);
           if b[x1,y1]='1' then inc(dem);
       until (b[x1,y1]='0') or (x1>=9) or (y1>=9);
       x1:=x;
       y1:=y;
       repeat
           dec(x1);
           dec(y1);
           if b[x1,y1]='1' then inc(dem);
       until (b[x1,y1]='0') or (x1<=1) or (y1<=1);
    end;
  cheo2:=dem;
end;

function max(hang,cot,cheo1,cheo2:integer):integer;
var m1,m2:integer;
begin
 if hang>cot then m1:=hang else m1:=cot;
 if cheo1>cheo2 then m2:=cheo1 else m2:=cheo2;
 if m1>m2 then max:=m1 else max:=m2;
end;

procedure xuli;
var M:integer;
begin
   clrscr;
 b:=a;
 M:=0;
 for i:=1 to 8 do
   for j:=1 to 8 do
     if b[i,j]='1' then
       if M<max(cot(i,j), hang(i,j), cheo1(i,j), cheo2(i,j)) then
         M:=max(cot(i,j), hang(i,j), cheo1(i,j), cheo2(i,j));
 writeln(M);
 readln;
end;

begin
 docfile;
 xuli;
end.
 
Q

quanghero100

Lúc nảy làm mình sợ trọng quá trình xử lí mảng A sẽ bị thay đổi do đó tính dùng mảng B để lấy các giá trị từ A và xử lí nhưng thực tế khi làm ra nó còn nguyên nên có thể bỏ bớt một mảng nha :D:D:D:D
 
C

cuong276

Bạn thử làm bài này luôn nha. Tí nữa mình xác nhận đúng luôn
Cho số nguyên N trong phạm vi từ 1000 đến 999999. Cần xác định xem số này có phải là thông tin về 1 ngày tháng có trong thế kỉ 21 hay không. (Thế kỉ 21 bắt đầu từ 1 tháng 1 năm 2001 và kết thúc vào ngày 31 tháng 12 năm 3000). Biết rằng 2 chữ số cuối của N là chỉ 2 chữ số cuối của năm, các chữ số còn lại (ở đầu) xác định ngày và tháng.
Ví dụ;
1111 tương ứng với 1 tháng 1 năm 2011;
21290 tương ứng với 2 tháng 12 năm 2090 hoặc 21 tháng 2 năm 2090;
121192 tương ứng với 12 thắng 11 năm 2092;
32392 không phải là thông tin về 1 ngày tháng nào cả;
311198 không phải là thông tin về 1 ngày tháng nào cả;
29205 không phải là thông tin về 1 ngày tháng nào cả;

Dữ liệu: Nhập vào số N từ bàn phím;
Kết quả: Đưa ra màn hình các ngày tháng năm tương ứng với N hoặc thông báo là KHONG nếu N không phải là thông tin về một ngày tháng nào cả.
Ví dụ
Giá trị của N:
1111
21290
29205
Thông báo ra màn hình tương ứng:
1-1-2011
2-12-2090 HOAC 21-2-2090
KHONG
Giúp mình tí nha. Mình sẽ xác nhận đúng cho. :)
 
Q

quanghero100

Mã:
uses crt;
var N:array[1..12] of byte;
    ngay1,ngay2,thang1,thang2,nam,d:integer;
    M:longint;
function nhuan(nam:integer):boolean;
begin
 if (nam mod 100 <>0) and (nam mod 4=0) then nhuan:=true
 else nhuan:=false;
end;
begin
   clrscr;
   N[1]:=32; N[2]:=28; N[3]:=31; N[4]:=30; N[5]:=31; N[6]:=30;
   N[7]:=31; N[8]:=31; N[9]:=30; N[10]:=31; N[11]:=30; N[12]:=31;
   readln(M);
   nam:=2000+M mod 100;
   M:=M div 100;
   thang1:=M mod 100; ngay1:= M div 100; thang2:=M mod 10; ngay2:=M div 10;
   d:=0;
   if (nhuan(nam)=true) and (thang1=2) and (ngay1>0) and (ngay1<=29) then
    begin
      write(ngay1,'-',thang1,'-',nam);
      inc(d);
    end;
   if  (nhuan(nam)=true) and (thang1<>2) and (thang1<=12) and (ngay1>0) and (ngay1<=N[thang1]) then
    begin
      write(ngay1,'-',thang1,'-',nam);
      inc(d);
    end;
   if (nhuan(nam)=false) and(thang1<=12) and  (ngay1>0) and (ngay1<=N[thang1]) then
    begin
      write(ngay1,'-',thang1,'-',nam);
      inc(d);
    end;


   if d<>0 then
     begin
       if (nhuan(nam)=true) and (thang2=2) and (ngay2>0) and (ngay2<=29) then
         begin
           writeln(' HOAC ',ngay2,'-',thang2,'-',nam);
           inc(d);
         end;
       if  (nhuan(nam)=true) and (thang2<>2) and (thang2<=12) and (ngay2>0) and (ngay2<=N[thang2]) then
         begin
           writeln(' HOAC ',ngay1,'-',thang1,'-',nam);
           inc(d);
         end;
       if (nhuan(nam)=false) and (thang2<=12) and (ngay2>0) and (ngay2<=N[thang2]) then
         begin
           writeln(' HOAC ',ngay2,'-',thang2,'-',nam);
           inc(d);
         end;
     end
   else
     begin
       if (nhuan(nam)=true) and (thang2=2) and (ngay2>0) and (ngay2<=29) then
         begin
           writeln(ngay2,'-',thang2,'-',nam);
           inc(d);
         end;
       if  (nhuan(nam)=true) and (thang2<>2) and (thang2<=12) and (ngay2>0) and (ngay2<=N[thang2]) then
         begin
           writeln(ngay1,'-',thang1,'-',nam);
           inc(d);
         end;
       if (nhuan(nam)=false) and (thang2<=12) and (ngay2>0) and (ngay2<=N[thang2]) then
         begin
           writeln(ngay2,'-',thang2,'-',nam);
           inc(d);
         end;
     end;
   if d=0 then writeln('KHONG');
readln;
end.
 
C

concanhcam

Bạn thử làm bài này luôn nha. Tí nữa mình xác nhận đúng luôn
Cho số nguyên N trong phạm vi từ 1000 đến 999999. Cần xác định xem số này có phải là thông tin về 1 ngày tháng có trong thế kỉ 21 hay không. (Thế kỉ 21 bắt đầu từ 1 tháng 1 năm 2001 và kết thúc vào ngày 31 tháng 12 năm 3000). Biết rằng 2 chữ số cuối của N là chỉ 2 chữ số cuối của năm các chữ số còn lại (ở đầu) xác định ngày và tháng.
Ví dụ;
1111 tương ứng với 1 tháng 1 năm 2011;
21290 tương ứng với 2 tháng 12 năm 2090 hoặc 21 tháng 2 năm 2090;
121192 tương ứng với 12 thắng 11 năm 2092;
32392 không phải là thông tin về 1 ngày tháng nào cả;
311198 không phải là thông tin về 1 ngày tháng nào cả;
29205 không phải là thông tin về 1 ngày tháng nào cả;

Dữ liệu: Nhập vào số N từ bàn phím;
Kết quả: Đưa ra màn hình các ngày tháng năm tương ứng với N hoặc thông báo là KHONG nếu N không phải là thông tin về một ngày tháng nào cả.
Ví dụ
Giá trị của N:
1111
21290
29205
Thông báo ra màn hình tương ứng:
1-1-2011
2-12-2090 HOAC 21-2-2090
KHONG
Giúp mình tí nha. Mình sẽ xác nhận đúng cho. :)

1111=
1/1/2011
1/11/2001
11/1/2001

Đề sai

thế nhá

Lưu ý : 29/2/2100 không có

thân
 
Last edited by a moderator:
C

cuong276

1111=
1/1/2011
1/11/2001
11/1/2001

Đề sai

thế nhá

Lưu ý : 29/2/2100 không có

thân
Nhìn kĩ đề đi chị ơi. Đề ra nói là 2 chữ số cuối của số N chỉ 2 chữ số cuối của năm cơ mà. Vậy nên 1111 chỉ có thể là 1 - 1 - 2011 mà thôi. Còn 29/2/2100 em viết hồi nào? Em viết là 29205 cơ mà
 
Q

quanghero100

Tóm lại dù đề có thế nào thì bải của tớ cũng đúng rùi :D:D:D các trường hợp mọi người nói mình đã nghĩ đến rùi :) :)
 
C

cuong276

Mình làm cách này không biết có đúng không nha
Mã:
var thu,ngay,thang,i,code,d:integer;
      n:longint;
      s,ng,th:string;
function KT(a,b,c:integer): boolean;
var KT1:boolean;
begin
    KT1:true; 
    if (c<2001) or (c>3000) then KT1:=false;
    if (b<1) or (b>12) then KT1:=false;
    case b of
           1,3,5,7,8,10,12 : if (a<1) or (a>31) then KT1:=false;
           4,6,9,11: if (a<1) or (a>30) then KT1:=false;
           2 : if ((c mod 400=0) or ((c mod 4=0) and (c mod 100<>0))) then
                    begin
                        if (a<1) or (a>29) then KT1:=false;
                    end;
                else if (a<1) or (a>28) then KT1:=false;
     end;
    KT:=KT1;
end;
begin
    write('nhap n='); readln(n);
    nam:=2000 + (n mod 100);
    n:=n div 100;
    str(n,s);
    ng:='';
    for i:=1 to length(s) div 2 do ng:=ng+s[i];
    th:='';
    for i:=(length(s) div 2 +1) to length(s) do th:=th+s[i];
    val(ng,ngay,code);
    val(th,thang,code);
    d:=0;
    if KT(ngay,thang,nam)=true then
       begin
           write(ngay,' - ',thang,' - ', nam);
           inc(d);
       end;
    if length(s) mod 2<>0 then
       begin
           ng:='';
           th:='';
           for i:=1 to (length(s) div 2) +1 do ng:=ng+s[i];
           for i:=(length(s) div 2) + 2 to length(s) do th:=th+s[i];
           val(ng,ngay,code);
           val(th,thang,code); 
           if KT(ngay,thang,nam)=true then
               begin
                   inc(d);
                   if d=2 then write(' HOAC ');
                   write(ngay,' - ',thang,' - ',nam);
               end;
        end;
    if d=0 then write('KHONG');
    readln;
end.
 
C

concanhcam

Nhìn kĩ đề đi chị ơi. Đề ra nói là 2 chữ số cuối của số N chỉ 2 chữ số cuối của năm cơ mà. Vậy nên 1111 chỉ có thể là 1 - 1 - 2011 mà thôi. Còn 29/2/2100 em viết hồi nào? Em viết là 29205 cơ mà


Chị nói là lưu ý

2100,2200, 2300, 2500, 2600,2700,2900,3000 không phải năm nhuận ok

Thân
Yêu cầu mod không sửa bài Dung

Thân
 
Last edited by a moderator:
Top Bottom