51nod 方陣與完全平方數(構造矩陣 dfs)

2021-07-28 13:19:43 字數 1720 閱讀 8224

1438 方陣與完全平方數

基準時間限制:1 秒 空間限制:131072 kb 分值: 40 

難度:4級演算法題

如果乙個由正整數組成的n*n的方陣,滿足以下條件:

1,每個數字各不相同

2,每行以及每列的和,都是互不相同的完全平方數

我們稱這種方陣為超級完全平方數方陣。

輸入n,輸出乙個n*n的超級完全平方數方陣。如果存在多個方陣滿足條件,輸出將所有元素按行、列順序排列後字典序最小的乙個答案。例如

n=3時,下面兩個方陣都符合條件

1   2   6

3   4   9

21 30 49

21 30 49

3   4   9

1   2   6

按行、列順序排列後,第乙個方陣表示為[1, 2, 6, 3, 4, 9, 21, 30, 49],第二個方陣表示為[21, 30, 49, 3, 4, 9, 1, 2, 6]。第乙個方陣字典序更小一些。

如果不存在這樣的方陣,輸出no solution。

input

僅一行,為乙個正整數n。(1 <= n <= 64)
output

輸出n行,每行為n個整數,之間用空格隔開,表示所求的n*n方陣。或者,輸出no solution。
input示例

3
output示例

1 2 6

3 4 9

21 30 49

mostleg

(題目提供者)

題解:首先,n=1時無解。

接下來處理n>=2的情況。由於

題目要求字典序最小的方陣,使用貪心演算法的思想,不難發現,每一行每一列其實只需要依靠最後乙個數字(最右邊和最下邊的數字)就足夠使得該行該列的和達到乙個沒有使用過的完全平方數。因此,按照題目中對方陣序列化的次序,對無關緊要的位置都盡力使用最小的數字;每當到達一行的最後乙個位置,或者最後一行的時候,再去尋找符合題目要求的最後乙個數字。這樣做直到右下角的最後乙個位置。

此時,最後一行和最後一列都需要滿足和為完全平方數的條件。搜尋最小的符合條件的數字。如果找不到解,就加大倒數第二個位置的數字(因為這樣做對字典序的影響最小),再重新搜尋最後乙個位置。

怎樣快速發現最後乙個位置找不到解呢?不難發現,最後一列的和必定小於最後一行的和,設它們的差為d。我們可以列舉較小的乙個完全平方數x,如果發現x的下乙個完全平方數與x的差已經大於d,則在最後乙個位置無解。

#include#include#include#includeusing namespace std;

typedef long long ll;

#define maxn 65

ll a[maxn][maxn],n,flag,used[100005],used1[100005];

ll find(ll x)

void dfs(ll x,ll y,ll id)

for(i=2;;i++)//列舉第n行的和

flag=1;

return;

}long long t=yy-xx;

if((i+1)*(i+1)-i*i>t)

}} else if(x==n)

else if(y==n)

else }

}int main()

a[1][1]=1;

dfs(1,1,1);

}

51NOD 與7無關數

1082 與7無關的數 有道難題 基準時間限制 1 秒 空間限制 131072 kb 分值 5 難度 1級演算法題 乙個正整數,如果它能被7整除,或者它的十進位制表示法中某個位數上的數字為7,則稱其為與7相關的數。求所有小於等於n的與7無關的正整數的平方和。例如 n 8,8與7無關的數包括 1 2 ...

51nod 第K大的數

題目鏈結 題意 題目給了我們陣列a和b,然後給了c陣列中各個元素是由陣列a和b相應元素相乘得到。讓我們求出陣列c中的第k大元素的值。題解 這道題目陣列a和b的長度n是5e4,因此直接不能直接求出所有陣列c元素的值。這類求第k大的問題,有時可以使用二分的方法進行求解。這道題目二分的思路就是,將陣列a和...

51nod動態規劃 矩陣取數

乙個n n矩陣中有不同的正整數,經過這個格仔,就能獲得相應價值的獎勵,從左上走到右下,只能向下向右走,求能夠獲得的最大價值。例如 3 3的方格。1 3 3 2 1 3 2 2 1 能夠獲得的最大價值為 11。input 第1行 n,n為矩陣的大小。2 n 500 第2 n 1行 每行n個數,中間用空...