[英]magic square wrong placement of some numbers
我試圖創建一個簡單的3x3魔術方塊。 3x3幻方由連續的整數(從1開始,以9結束)組成,這些整數由“ n”列放入“ n”行,因此所有行,所有列和對角線的總和相同。
我的算法是1向上,剩下1。
我的問題是我很難弄清楚為什么我不能保留我的前一個數字,如果下一列被一個數字占據,則降低1。 先感謝您
#include <iostream>
using namespace std;
int main ()
{
int magicsq[3][3];
int i,j,x;
int row=0; //start positon of row
int col=3/2; // and colum
for( i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
magicsq[i][j] = 0; //initialize to 0 your matrix
}
}
magicsq[row][col] = 1; //position to star the counting
for(x=2;x<3*3;x++)
{
row--;
col--;
if(row<0){
row=row+3;
}
if(col<0){
col=col+3;
}
if(magicsq[row][col]!=0)
{
row++; //i think this is where im having trouble
}
magicsq[row][col] = x;
}
for( i = 0; i<3;i++){
for(j = 0; j<3;j++)
{
cout<<magicsq[i][j] <<" ";
}
cout<<endl;
}
}
除以整數問題; 就這樣。 3/2是1。
if(magicsq[row][col!=0])
也是有效的(所選的列將為0或1),但我認為您的意思是if(!magicsq[row][col])
我從未聽說過Magic Squares,並向Wikipedia咨詢了有關它們。 不出所料,我發現了各種構建算法的描述。
我確定了de laLoubère的算法是OP顯然試圖實現的算法。 恕我直言,這種嘗試實際上還不錯。
我給出的提示(缺少行換行) if(magicsq[row][col]!=0) row++;
for (x=2;x<3*3;x++)
(缺少迭代步驟for (x=2;x<3*3;x++)
似乎是合理的。
考慮到這一點,我讓算法開始運行。 我的第一個結果看上去還不錯,但是結果檢查表明它實際上是錯誤的。 我切換了行和列計數的一些方向,但是沒有運氣。 然后,我再次訪問了上面的鏈接文章,並將所描述的內容與實現的內容進行了比較。 最終,我發現我在實現過程中犯了另一個語義錯誤。 我相信OP也能做到:
該方法規定從第一行的中心列開始,編號為1。此后,填充正方形的基本運動是一次向上和向右對角線。 如果遇到實心方塊,則改為垂直向下移動一個方塊,然后像以前一樣繼續。 當“向上並向右”移動離開正方形時,它將分別環繞到最后一行或第一列。
相反 ,強調是我自己完成的–我錯過了細節。 因此,有必要進行更改:如果已經填充了新單元格,則必須丟棄新單元格的坐標。 相反 ,新坐標將分別與下一行向下(即++row
)。 環繞式。 解決此問題后,樣本計算出正確的結果:
#include <iostream>
int main()
{
int magicsq[3][3] = {0}; // initializes magic square with all 0s
// Algorithm of de la Loubere:
int row = 0, col = 1; // start coordinates
// assign start cell
magicsq[row][col] = 1;
for (int x = 2; x <= 9; ++x) {
// compute up-right coordinates
int rowT = row - 1; if (rowT < 0) rowT += 3;
int colT = col + 1; if (colT >= 3) colT -= 3;
// check whether cell not yet assigned
if (magicsq[rowT][colT]) {
// compute down coordinates
if (++row >= 3) row -= 3;
} else {
// use up-right coordinates
row = rowT; col = colT;
}
// assign next cell
magicsq[row][col] = x;
}
// output of result:
std::cout << "Magic Square:" << std::endl;
for (row = 0; row < 3; ++row) {
for (col = 0; col < 3; ++col) {
std::cout << ' ' << magicsq[row][col];
}
std::cout << std::endl;
}
// check result:
std::cout << "Row sums:";
for (row = 0; row < 3; ++row) {
int sum = 0;
for (col = 0; col < 3; ++col) sum += magicsq[row][col];
std::cout << ' ' << sum;
}
std::cout << std::endl;
std::cout << "Column sums:";
for (col = 0; col < 3; ++col) {
int sum = 0;
for (row = 0; row < 3; ++row) sum += magicsq[row][col];
std::cout << ' ' << sum;
}
std::cout << std::endl;
std::cout << "Diagonal sums: ";
int sumM = 0, sumC = 0;
for (row = 0; row < 3; ++row) {
sumM += magicsq[row][row];
sumC += magicsq[row][2 - row];
}
std::cout << ' ' << sumM << ' ' << sumC << std::endl;
// done
return 0;
}
輸出為:
Magic Square:
8 1 6
3 5 7
4 9 2
Row sums: 15 15 15
Column sums: 15 15 15
Diagonal sums: 15 15
注意:
通過描述實現這種算法,您很容易陷入困境。 根據說明,描述使用“向上”,“向下”。 因此,需要清晰的映射來定義與矩陣存儲有關的“向上”和“向下”的含義。 在我的情況下,“ row up”是row
減少,“ row down”是row
增加。 在此特定情況下,它可能也相反,因為鏈接的文章提到結果矩陣可以水平和垂直鏡像。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.