更新:好的,我已经修改了这个问题,因为一些负面的人只是想抱怨而不是试图提供某种建设性的帮助。
我知道这个问题的变化已被问到,但我很确定我的不同。
我正在尝试做一些类似于魔术盒的tic tac toe,但有一个变化。
传统上,Magic TicTacToe框指的是数字1-9,你被要求在tictactoe框中排列它们,使得3组的每次迭代都相同。从这个意义上说,每次运行3个数字必须等于15.每个可能的方向,都有8个序列要测试。计算的重要部分是1-9的总和是45,除以3就是告诉你每次运行3应该等于15。
现在,据我所知,有一种递归形式可以通过数字组合来运行,但我不太清楚如何做到这一点。我希望能够输入一个数字(可被3和9整除)作为输入,并且它不仅可以确定获得该总数所需的唯一(非重复)数字,而且这些数字应该如何使用
实施例: 我知道我可以简单地将数字除以9以确定中位数,在这种情况下已经给了我一个字母,在这种情况下它将是E.我知道我可以简单地运行一对for循环来获取剩余的数字。我不知道该怎么做是找出递归过程来确定每个数字的正确分配。
以下是字母分配的示例:
G | F | A
H | E | B
I | D | C
您需要以下组合:
A+B+C
F+E+D
G+H+I
A+E+I
G+E+C
G+F+A
H+E+B
I+D+C
现在,我不确定的,以及它可能产生的影响,是每个数字的使用频率。我知道上面的每个序列都需要等于数字输入除以3,在这种情况下将是30,但我不确定哪些重要事实可用于创建正确的嵌套for循环和/或if语句对所创建的数字列表或数组进行排序,并根据它们的相关性正确分配它们。
考虑到E使用4次(这就是为什么它是中心),A,C,I和G使用3次,H,B,D和F使用2次。
因此,为了澄清,我希望所有这些都能输出A,B,C等应该等于给定的限制。
感谢您的帮助。 作为一个额外的请求,虽然不是必需的,但非常感激 - 如果你确实提供了一个答案,解释一些重要的递归部分,使用的函数以及它如何实现我想要的结果将会很棒。
我想我此时已经提出了我的问题。关于某人的评论,是的,我要求代码,因为我不够精通,无法弄清楚递归的复杂使用,需要不断检查所需的约束,并且两个,没有其他问题真正进入我觉得我想去的那种细节。大多数只是组合和排列的正常统计使用,但似乎没有对结果有太多限制,和/或它们的最终目标是不同的。
为了清楚说明,这是另一个编辑:
以下是我必须首先生成将要使用的所有数字的列表。
int A, B, C, D, E, F, G, H, I;
Console.WriteLine("Choose a number that's all 9 spots added together.");
Console.WriteLine("Make sure the number is divisble by 3 and 9.");
int myNumber = int.Parse(Console.ReadLine());
int sums = myNumber / 3;
E = myNumber / 9;
if (E%1 != 0)
{
Console.WriteLine("You did not enter a value divisible by 3 and 9");
Console.WriteLine("Try again.");
Console.ReadLine();
}
else
{
List<int> list = new List<int>();
int lowest = E - 4;
for (int x = lowest;x < E; x++)
{
list.Add(x);
}
int highest = E + 4;
for (int y=E;y<highest;y++)
{
list.Add(y+1);
}
//Testing output
foreach (int i in list)
{
Console.WriteLine(i);
}
我首先看看我是否可以建立将要使用的数字,然后查找数字的所有变化,这将使所有线条相同。例如:如果他们输入45,所有方向必须等于15;如果他们进入90,所有方向都必须等于30等。
答案 0 :(得分:0)
你走了。把自己弄出来。
Func<IEnumerable<int>, IEnumerable<int[]>> permutate = null;
permutate = ns =>
{
if (!ns.Skip(1).Any())
{
return new [] { ns.ToArray() };
}
else
{
return
from n in ns
from ns2 in permutate(ns.Except(new [] { n }))
select new [] { n }.Concat(ns2).ToArray();
}
};
var results =
permutate(Enumerable.Range(1, 9))
.Where(ns => Enumerable.Range(0, 3).All(n => ns[n * 3] + ns[n * 3 + 1] + ns[n * 3 + 2] == 15))
.Where(ns => Enumerable.Range(0, 3).All(n => ns[n] + ns[3 + n] + ns[6 + n] == 15))
.Where(ns => Enumerable.Range(0, 3).All(n => ns[0] + ns[4] + ns[8] == 15))
.Where(ns => Enumerable.Range(0, 3).All(n => ns[2] + ns[4] + ns[6] == 15));
这给出了:
2, 7, 6
9, 5, 1
4, 3, 8
2, 9, 4
7, 5, 3
6, 1, 8
4, 3, 8
9, 5, 1
2, 7, 6
4, 9, 2
3, 5, 7
8, 1, 6
6, 1, 8
7, 5, 3
2, 9, 4
6, 7, 2
1, 5, 9
8, 3, 4
8, 1, 6
3, 5, 7
4, 9, 2
8, 3, 4
1, 5, 9
6, 7, 2
答案 1 :(得分:0)
我明白@tekGiant正在问什么,但我不知道如何回答......
G | F | A
H | E | B
I | D | C
您需要以下组合:
A+B+C=X
F+E+D=X
G+H+I=X
A+E+I=X
G+E+C=X
G+F+A=X
H+E+B=X
I+D+C=X
其中X是您指定为每个不同组合加起来的初始数字。