对于大学我必须实现一个算法,该算法为给定的边长和特定的总和创建所有可能的魔方.对于n = 3,算法按预期工作.但是当我在一段时间内为n = 4生成所有魔术方格时,我的内存耗尽.任务说明中已经提到过此问题.我已经尝试优化代码,但它仍然无法正常工作.所以我希望有人能给我一些建议.
我的基本想法是:首先,我生成所有可能的行,我可以使用给定的数字,然后我试图将这些组合起来,以满足魔方的限制.这通过回溯发生.我认为问题是在makeRows存储所有行之后消耗太多内存的函数.
如果您需要更多解释我可以提供的代码!
magicSquare(N, Value) ->
Squares = buildSquare(N, makeRows(N, N*N, Value, N)),
io:fwrite("Squares ready"), io:fwrite("~n"),
Result = lists:filter(fun(X) -> testsquare(X, N, Value) end, Squares),
io:write(length(Result)),
Result.
buildSquare(0, _) -> [[]];
buildSquare(Rows, AvailableRows) ->
[ [X|L] || L <- buildSquare(Rows-1, AvailableRows), X <- AvailableRows, onlyUniqueNumbers(lists:flatten([X|L]))].
onlyUniqueNumbers(List) -> erlang:length(List) == sets:size(sets:from_list(List)).
%produces all possible rows with a dimension of Fields and the Numbers from 1 to Numbers and the right sum for each row
makeRows(0,_,_,_) …Run Code Online (Sandbox Code Playgroud) 对于那些不熟悉经典魔方算法的人:魔方是一个二维数组(nxn),它包含每个位置中值1和n ^ 2之间的数值.每个值只能出现一次.此外,每行,列和对角线的总和必须相同.输入应该是奇怪的,因为我正在写一个奇怪的方形解决方案.
我已经完成了这个问题,但截至目前它有一个未知的错误(逻辑?输出?),这一直困扰着我过去一小时.输出的值非常不合适.任何帮助将非常感谢:
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int n;
cout<< "Please enter an odd integer: ";
cin>>n;
int MagicSquare[n][n];
int newRow,
newCol;
// Set the indices for the middle of the bottom i
int i =0 ;
int j= n / 2;
// Fill each element of the array using the magic array
for ( int value = 1; value <= n*n; value++ )
{
MagicSquare[i][j] = value;
// Find the next cell, wrapping around …Run Code Online (Sandbox Code Playgroud) 在Ocatave/Matlab中,我可以magic()用来获得一个魔方,例如,
magic(4)
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
Run Code Online (Sandbox Code Playgroud)
定义:幻方是N×N数字网格,其中每行,列和主对角线中的条目总和为相同的数字(等于N(N^2+1)/2).
如何使用NumPy生成相同的内容?
我一直在编写解决各种数字难题的程序,但我一直在设计无法合理的复杂搜索算法.
例如,在一个谜题中,您将获得一个3x3网格,数字1到9如下:
123
456
789
Run Code Online (Sandbox Code Playgroud)
您可以在任何方向上循环任何行或列中的数字.下面是将顶行数字向右移动的示例.如果它们位于网格的边缘,则数字将循环.
123 -> 312
456 456
789 789
Run Code Online (Sandbox Code Playgroud)
您必须以这种方式移动数字,直到创建一个魔术方块,其中每列,行和对角线中的数字总和为15.
我编写了一个DFS强力算法来测试所有可能的移动序列,尽管每个回合的可用移动次数呈指数增长(大约12 ^ [当前转弯]),使其无用.
看起来BFS最适合找到正确的动作,但这需要我存储数百甚至数千个网格副本才能回溯!
我一直遇到这些问题.BFS和DFS算法分别使用太多的内存和时间.我需要帮助优化这些算法,以便它们更快更有效地运行.也许识别数字的模式和关系或者让算法逻辑朝着目标努力会有所帮助吗?(我不知道会带来什么).
编辑:
我的固定算法就像一个魅力.学习如何对我的排列进行编号是至关重要的.谢谢你们!
我试图在限制条件下找到一个优雅的算法来创建1和0的N×N矩阵:
矩阵不是严格必要的随机(随机和非随机解决方案都很有趣),因此对于Q均匀,只需使每一行成为矢量的循环移位
[0 1 1 0 ... 0 0 0 ... 0 1 1](Q = 4)
是一个有效的解决方案
但是,如何为Q奇做这个?或者如何为Q偶然做,但是以随机方式?
对于那些好奇的人,我试图在抽象网络上测试一些现象.
如果以前已经回答过这个问题我很抱歉,但我找不到任何问题都有对称限制,这似乎使它变得更加复杂.我没有证明这样的矩阵总是存在,但我确实这样认为.
我必须制作一个计算魔法矩阵的程序,我已经制作了??我的代码并且它可以工作,但我的置换非常慢。我需要一个更快的人可以帮助我请
这是代码:
diabolico([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P]) :-
permutar([1,14,3,16,5,12,13,15,9,10,11,6,7,2,8,4],[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P]),
A+B+C+D=:=34, E+F+G+H=:=34, I+J+K+L=:=34, M+N+O+P=:=34,
A+E+I+M=:=34, B+F+J+N=:=34, C+G+K+O=:=34, D+H+L+P=:=34,
M+B+G+L=:=34, I+N+C+H=:=34, E+J+O+D=:=34, A+F+K+P=:=34,
P+C+F+I=:=34, L+O+B+E=:=34, H+K+N+A=:=34, D+G+J+M=:=34.
permutar([],[]).
permutar([X|Y], Z):-
permutar(Y,L),
insertar(X,L,Z).
insertar(E,L,[E|L]).
insertar(E, [X|Y], [X|Z]):-
insertar(E, Y, Z).
Run Code Online (Sandbox Code Playgroud) 我必须编写一个程序,从用户那里获取一个奇数,并创建一个魔术方块.幻方是每行,列和对角线的总和相同的方格.这些是编写代码的特征:
- 询问用户奇数
- 创建一个n×n数组.
- 按照以下步骤创建一个魔术方块.
一个.在第一行的中间放置一个1.
湾 从行中减去1并将1添加到列中.
一世.如果可能,将下一个号码放在该位置.
II.如果不可能,请按照下列步骤操作.
- 如果在行-1中,则更改为最后一行
- 如果在最后一列中更改为第一列
- 如果被阻止,则下拉到下一行(从原始位置)
- 如果在右上角,则下拉到下一行.
- 打印阵列
我已经编写了代码,但是当我运行它时,程序会输入所有数字,除了第二个; 由于某种原因,我的程序跳过了它.例如,如果我输入数字3作为奇数,我的输出是:
6 1 0
3 4 5
9 7 8
Run Code Online (Sandbox Code Playgroud)
0不应该在那里,但第二个是.这是我的代码:
public static void main(String[] args) {
System.out.print("Give an odd number: ");
int n = console.nextInt();
int[][] magicSquare = new int[n][n];
int number = 1;
int row = 0;
int column = n / 2;
while (number <= n * n) {
magicSquare[row][column] = number;
number++;
row -= 1;
column += 1;
if (row == …Run Code Online (Sandbox Code Playgroud) 我在编写用于求解Magic Squares的递归置换函数时遇到了一些麻烦.对于这个函数,我不允许使用二维数组,只能使用列表.以下是我目前的情况:
def permute(size):
magicSquare = []
for value in permute(size**2):
for pos in range(size**2 + 1):
magicSquare.append(value)
return magicSquare
Run Code Online (Sandbox Code Playgroud)
size 由用户通过命令行参数定义.
如果上面写的函数完成了置换值的任务,我会感到有些困惑.
我想知道如何创建具有随机自然数但每列总和等于每行总和对角线总和的矩阵。
我的意思是,您创建了一个函数,该函数通过选择行,列和对角线的尺寸和总和为您提供一个如上所述的方阵,但是每行和每列的数字不同。
有人知道如何做到这一点吗?
我想自己创建一个没有任何程序包的功能,以完全理解该程序。
magic-square ×9
algorithm ×2
matrix ×2
optimization ×2
python ×2
arrays ×1
c++ ×1
erlang ×1
graph ×1
java ×1
memory ×1
numpy ×1
performance ×1
permutation ×1
prolog ×1
r ×1
recursion ×1
search ×1
while-loop ×1