求教(有没有人能做的出来的--最好能用多种方法)

CycloneFox 2003-10-10 11:27:13
9个数字从1~9分别放在3*3的格子里使横,竖,斜相加所得的数均等于同一个数.
用C++编写.
扩展为25,49,81个数.
那位大虾肯帮小弟这个忙呀?
...全文
46 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
CycloneFox 2003-10-12
  • 打赏
  • 举报
回复
楼上的师兄,谢谢了。
CycloneFox 2003-10-11
  • 打赏
  • 举报
回复
谢谢了真是太好了.
哈哈.
BlueSky2008 2003-10-11
  • 打赏
  • 举报
回复
FAQ->组合数学算法->n阶幻方解法。
nealzane 2003-10-11
  • 打赏
  • 举报
回复
修正了小小的漏洞(不过也是洞啊 =_=b):

#include <iostream>
using namespace std;

bool used[12] = { false };

int board[4][4];

bool check(void) {
return (board[1][1] + board[2][1] + board[3][1] == 15 &&
board[1][2] + board[2][2] + board[3][2] == 15 &&
board[1][3] + board[2][3] + board[3][3] == 15 &&
board[1][1] + board[2][2] + board[3][3] == 15 &&
board[1][3] + board[2][2] + board[3][1] == 15);
}

void rowAt(int row) {
if (row == 0) {
if (check()) {
for (int i = 1; i <= 3; i ++, cout << endl)
for (int j = 1; j <= 3; j ++)
cout << board[i][j] << ' ';
cout << endl;
}
}
else {
for (int i = 1; i <= 9; i ++) {
if (!used[i]) {
used[i] = true;
board[row][1] = i;
for (int j = 1; j <= 9; j ++) {
if (!used[j]) {
used[j] = true;
board[row][2] = j;
int k = 15 - i - j;
if (k > 0 && k < 10 && !used[k]) {
used[k] = true;
board[row][3] = k;
rowAt(row - 1);
used[k] = false;
}
used[j] = false;
}
}
used[i] = false;
}
}
}
}

int main(void) {
rowAt(3);
}

------------------------------------------------------------

输出:

4 3 8
9 5 1
2 7 6

6 1 8
7 5 3
2 9 4

2 7 6
9 5 1
4 3 8

8 1 6
3 5 7
4 9 2

2 9 4
7 5 3
6 1 8

8 3 4
1 5 9
6 7 2

4 9 2
3 5 7
8 1 6

6 7 2
1 5 9
8 3 4

nealzane 2003-10-11
  • 打赏
  • 举报
回复
扔块砖头:

#include <iostream>
using namespace std;

bool used[12] = { false };

int board[4][4];

bool check(void) {
return (board[1][1] + board[2][1] + board[3][1] == 15 &&
board[1][2] + board[2][2] + board[3][2] == 15 &&
board[1][3] + board[2][3] + board[3][3] == 15 &&
board[1][1] + board[2][2] + board[3][3] == 15 &&
board[1][3] + board[2][2] + board[3][1] == 15);
}

void rowAt(int row) {
if (row == 0) {
if (check()) {
for (int i = 1; i <= 3; i ++, cout << endl)
for (int j = 1; j <= 3; j ++)
cout << board[i][j] << ' ';
cout << endl;
}
}
else {
for (int i = 1; i <= 9; i ++) {
if (!used[i]) {
used[i] = true;
board[row][1] = i;
for (int j = 1; j <= 9; j ++) {
if (!used[j]) {
used[j] = true;
board[row][2] = j;
int k = 15 - i - j;
if (k > 0 && !used[k]) {
used[k] = true;
board[row][3] = k;
rowAt(row - 1);
used[k] = false;
}
used[j] = false;
}
}
used[i] = false;
}
}
}
}

int main(void) {
rowAt(3);
}

------------------------------------------------------------

输出:

4 3 8
9 5 1
2 7 6

6 1 8
7 5 3
2 9 4

2 7 6
9 5 1
4 3 8

8 1 6
3 5 7
4 9 2

2 9 4
7 5 3
6 1 8

8 3 4
1 5 9
6 7 2

4 9 2
3 5 7
8 1 6

6 7 2
1 5 9
8 3 4
Kavent 2003-10-10
  • 打赏
  • 举报
回复
幻方问题嘛~

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧