問題描述
小明最近在教鄰居家的小朋友小學奧數,而最近正好講述到了三階幻方這個部分,三階幻方指的是將1~9不重複的填入乙個3*3的矩陣當中,使得每一行、每一列和每一條對角線的和都是相同的。
三階幻方又被稱作九宮格,在小學奧數里有一句非常有名的口訣:「二四為肩,六八為足,左三右七,戴九履一,五居其中」,通過這樣的一句口訣就能夠非常完美的構造出乙個九宮格來。
4 9 2
3 5 7
8 1 6
有意思的是,所有的三階幻方,都可以通過這樣乙個九宮格進行若干映象和旋轉操作之後得到。現在小明準備將乙個三階幻方(不一定是上圖中的那個)中的一些數抹掉,交給鄰居家的小朋友來進行還原,並且希望她能夠判斷出究竟是不是只有乙個解。
而你呢,也被小明交付了同樣的任務,但是不同的是,你需要寫乙個程式~
輸入格式
輸入僅包含單組測試資料。
每組測試資料為乙個3*3的矩陣,其中為0的部分表示被小明抹去的部分。
對於100%的資料,滿足給出的矩陣至少能還原出一組可行的三階幻方。
輸出格式
如果僅能還原出一組可行的三階幻方,則將其輸出,否則輸出「too many」(不包含引號)。
樣例輸入
0 7 2
0 5 0
0 3 0
樣例輸出
6 7 2
1 5 9
8 3 4
題目分析
推理可知,三階幻方數量可控,因此可以先寫乙個dfs函式,把所有的三階幻方的儲存起來,再進行比對。
#include #include#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
int m[3][3] =,,},
,,},
,,},
,,},
,,},
,,},
,,},
,,},
};int maze[3][3
];int vist[10
];int sum = 0
;int
index;
intiscorrect()
if (maze[0][0] + maze[1][1] + maze[2][2] != 15
)
return0;
if (maze[0][2] + maze[1][1] + maze[2][0] != 15
)
return0;
return1;
}void print1(int
ii)
cout
<}
}void
print()
cout
<}
cout
<}void dfs(int
index)
for (int j = 1; j <= 9; j++)
}}int isequal(int
i) }
}return1;
}int
main()
}for (int i = 0; i < 8; i++)
}if (sum == 1
) print1(index);
else
printf(
"too many");
//dfs(0);
return0;
}
歷屆試題 九宮幻方
歷屆試題 九宮幻方 時間限制 1.0s 記憶體限制 256.0mb 問題描述 小明最近在教鄰居家的小朋友小學奧數,而最近正好講述到了三階幻方這個部分,三階幻方指的是將1 9不重複的填入乙個3 3的矩陣當中,使得每一行 每一列和每一條對角線的和都是相同的。三階幻方又被稱作九宮格,在小學奧數里有一句非常...
歷屆試題 九宮幻方
問題描述 小明最近在教鄰居家的小朋友小學奧數,而最近正好講述到了三階幻方這個部分,三階幻方指的是將1 9不重複的填入乙個3 3的矩陣當中,使得每一行 每一列和每一條對角線的和都是相同的。三階幻方又被稱作九宮格,在小學奧數里有一句非常有名的口訣 二四為肩,六八為足,左三右七,戴九履一,五居其中 通過這...
歷屆試題 九宮幻方
問題描述 小明最近在教鄰居家的小朋友小學奧數,而最近正好講述到了三階幻方這個部分,三階幻方指的是將1 9不重複的填入乙個3 3的矩陣當中,使得每一行 每一列和每一條對角線的和都是相同的。三階幻方又被稱作九宮格,在小學奧數里有一句非常有名的口訣 二四為肩,六八為足,左三右七,戴九履一,五居其中 通過這...