NOIP2015提高組Day1 神奇的幻方

2021-07-22 13:40:10 字數 1878 閱讀 1492

【問題描述】

幻方是一種很神奇的 n*n矩陣:它由數字1,2,3, … … ,n*n 構成,且每行、每列及兩條對角線上的數字之和都相同。  當n為奇數時,我們可以通過以下方法構建乙個幻方: 首先將1寫在第一行的中間。  之後,按如下方式從小到大依次填寫每個數k(k= 2,3, … ,n*n ):  1. 若(k−1)在第一行但不在最後一列,則將k填在最後一行,(k− 1)所在列 的右一列;  2. 若(k− 1)在最後一列但不在第一行,則將k填在第一列,(k− 1)所在行 的上一行;  3. 若(k− 1)在第一行最後一列,則將k填在(k− 1)的正下方;  4. 若(k− 1)既不在第一行,也不在最後一列,如果(k− 1)的右上方還未填 數,則將k填在(k− 1)的右上方,否則將k填在(k− 1)的正下方 現給定n,請按上述方法構造 n*n 的幻方。
【輸入格式】

輸入檔名為magic.in。  輸入檔案只有一行,包含乙個整數n,即幻方的大小。
【輸出格式】

輸出檔名為magic.out。  輸出檔案包含n行,每行n個整數,即按上述方法構造出的n*n的幻方。相鄰兩個整數之間用單個空格隔開。
【題解】

乙個水水的搜尋。
【**】

var

a:array [0..40,0..40] of longint;

n:longint;

procedure

print;

var i,j:longint;

begin

for i:=1

to n do

begin

for j:=1

to n do

write(a[i,j],' ');

writeln;

end;

end;

procedure

main

(m,x,y:longint);

var i:longint;

begin

if m>n*n then

begin

print;

halt;

end;

if (x=1) and (y<>n) then

begin

a[n,y+1]:=m;

main(m+1,n,y+1);

endelse

if (x<>1) and (y=n) then

begin

a[x-1,1]:=m;

main(m+1,x-1,1);

endelse

if (x=1) and (y=n) then

begin

a[x+1,y]:=m;

main(m+1,x+1,y);

endelse

begin

if a[x-1,y+1]=0

then

begin a[x-1,y+1]:=m; main(m+1,x-1,y+1); end

else

begin a[x+1,y]:=m; main(m+1,x+1,y); end;

end;

end;

begin

assign(input,'magic.in');

assign(output,'magic.out');

reset(input);

rewrite(output);

readln(n);

a[1,n div

2+1]:=1;

main(2,1,n div

2+1);

close(input);

close(output);

end.

NOIP2015提高組Day1 資訊傳遞

問題描述 有n個同學 編號為1到n 正在玩乙個資訊傳遞的遊戲。在遊戲裡每人都有乙個固定的資訊傳遞物件,其中,編號為i的同學的資訊傳遞物件是編號為ti的同學。遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前所知的生日資訊告訴各自的資訊傳遞物件 注意 可能有人可以從若干人那裡獲取...

NOIP2015提高組Day1鬥地主

仔細看,這道題著實想不到什麼優美的演算法,那麼基本確定方向 dfs。先分析,這題的花色是沒用的 我們再分析,會發現這題的出牌順序是不影響答案的 那麼我們便可以先出牌多的 因為這樣答案便會先便小,那麼便可以方便後面的剪枝 也就是我們先打順子再打帶牌!順子是沒有什麼技巧的,便直接暴搜 當然也是先暴搜長度...

NOIP2015提高組Day1 鬥地主

這道題做的時候讓我幾近崩潰,因為如果要打暴力的話太煩了不想打 但是我們發現 這樣只要判斷前六種方法就行了,打幾個判斷,30 首先,做一下基本處理 簡化題目 因為一般的鬥地主除了大王小王,沒有花色的大小區別,但這裡也不是讓你贏,只是自己乙個人快速打光牌。我們發現花色並沒有什麼用,可以免去。所以我們我們...