【問題描述】
幻方是一種很神奇的 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 首先,做一下基本處理 簡化題目 因為一般的鬥地主除了大王小王,沒有花色的大小區別,但這裡也不是讓你贏,只是自己乙個人快速打光牌。我們發現花色並沒有什麼用,可以免去。所以我們我們...