Offer收割 程式設計聯賽1 A 九宮問題

2021-07-10 15:12:48 字數 1685 閱讀 2334

題目1:九宮

小hi最近在教鄰居家的小朋友小學奧數,而最近正好講述到了三階幻方這個部分,三階幻方指的是將1~9不重複的填入乙個3*3的矩陣當中,使得每一行、每一列和每一條對角線的和都是相同的。

三階幻方又被稱作九宮格,在小學奧數里有一句非常有名的口訣:「二四為肩,六八為足,左三右七,戴九履一,五居其中」,通過這樣的一句口訣就能夠非常完美的構造出乙個九宮格來。

有意思的是,所有的三階幻方,都可以通過這樣乙個九宮格進行若干映象和旋轉操作之後得到。現在小hi準備將乙個三階幻方(不一定是上圖中的那個)中的一些陣列抹掉,交給鄰居家的小朋友來進行還原,並且希望她能夠判斷出究竟是不是只有一組解。

而你呢,也被小hi交付了同樣的任務,但是不同的是,你需要寫乙個程式~

輸入僅包含單組測試資料。

每組測試資料為乙個3*3的矩陣,其中為0的部分表示被小hi抹去的部分。

對於100%的資料,滿足給出的矩陣至少能還原出一組可行的三階幻方。

如果僅能還原出一組可行的三階幻方,則將其輸出,否則輸出「too many」(不包含引號)。

樣例輸入

0 7 2

0 5 0

0 3 0

樣例輸出

6 7 2

1 5 9

8 3 4

思路:題目的本質是乙個dfs(深度優先搜尋),將未出現在幻方中的數字依次填入不同位置進行嘗試,若不成功則換一種排列。

**解析:

**中inp陣列用於儲存原始使用者輸入的資料,test陣列用於暫時儲存測試幻方例子,res陣列儲存最終結果或其中乙個,used為標記陣列,用於標記已經在幻方中的數字,flag用於判斷最後可還原出幻方個數是否大於1個。

1. check()函式檢測是否符合幻方要求,按照行、列、正對角和反對角的順序,返回bool值。

2. dfs為核心函式,採用遞迴實現,原理如下:

(1)若游標cur==10,表示測試幻方準備好(test陣列已滿),可以進行測試是否符合要求(check函式),若成立,則將test陣列儲存至res陣列,flag加1,函式結束。

(2)若cur!=10,表示測試幻方未準備好(test陣列還有空缺),分兩種情況:

第一種情況,使用者輸入幻方中該cur位置有數字,就將該數字複製到test陣列中,然後進行遞迴;

第二種情況,使用者輸入幻方中該cur位置沒有數字,將未出現的數字填入其中並將該數字的標誌變為已使用,再進行遞迴;

如此下去直到遍歷所有情況完為止。

原始碼:

#include #include using namespace std;

int inp[10],test[10],res[10],used[10];

int flag = 0;

bool check()

for(i=1;i<=3;i++)//測試列是否符合

return true;

}void dfs(int cur)

else

else}}

}}int main()

; memcpy(inp,a,sizeof(a));

dfs(1);

if(flag == 1)

}else if(flag > 1)

cout << "too many" << endl;

return 0;

}

程式設計練習(九宮格手機輸入)

題目 手機的九宮格輸入,2上是 abc 9 對應 wxyz 現假設 1 和 0 為空字元,根據手機上的輸出,判斷手機輸入了哪幾個數字。要求 輸入 字串s代表手機上的輸出。輸出 依次輸出手機上輸入的數字。思路 1 建立乙個2 9對應字元的陣列,使用迭代器遍歷查詢。2 可以用string.find 來查...

Offer收割 程式設計練習賽1

做了三題,題目都比較暴力。a題 題意 給你乙個三階的幻方,三階幻方指的是將1 9不重複的填入乙個3 3的矩陣當中,使得每一行 每一列和每一條對角線的和都是相同的。現在準備將乙個三階幻方中的一些陣列抹掉 0代替 交給你來進行還原,並且希望她能夠判斷出究竟是不是只有一組解。如果只有一組解,輸出該三階幻方...

程式設計開發九宮重排 (搜尋)問題解析

問題描述 在九宮格中放置8個數,有乙個為空格。給定初始狀態九宮格,和目標狀態九宮格,問需要多少步可以將初始狀態變成目標狀態。如果無法達到輸出 1,如果可以達到,輸出最少的步驟數。問題分析 本題屬於搜尋演算法中的經典題目。可以用很多方法來解答,一般有a 演算法和廣度搜尋bfs。因為廣度搜尋較容易理解,...