zjbonrace 2015-01-13 05:48 采纳率: 75%
浏览 1660
已采纳

link如何解决如下矩阵生成难题?注意一定要用link实现。

将1~N*N放入一个N*N的矩阵,要求矩阵每行每列以及对角线的和相等。请问怎么实现?注意一定要用link实现。

  • 写回答

1条回答 默认 最新

  • threenewbee 2015-01-13 06:51
    关注
     using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication2
    {
        class Program
        {
            static void Main(string[] args)
            {
                int n = 3;
                var result = solve(n, new int[] { }).First();
                for (int i = 0; i < n; i++)
                {
                    Console.WriteLine(string.Join("\t", result.Skip(i * n).Take(n).Select(x => x.ToString())));
                }
            }
    
            static IEnumerable<int[]> solve(int n, int[] current)
            {
                if (current.Length == n * n)
                {
                    yield return current;
                    yield break;
                }
                foreach (int item in Enumerable.Range(1, n * n).Where(x => !current.Contains(x) && foo(n, current, x)))
                {
                    foreach (var i in solve(n, current.Concat(new int[] { item }).ToArray()))
                        yield return i;
                }
            }
    
            static bool foo(int n, int[] current, int next)
            {
                int[] arr = current.Concat(new int[] { next }).Concat(Enumerable.Repeat(0, n * n - current.Length - 1)).ToArray();
                int sum3 = 0, sum4 = 0;
                for (int i = 0; i < n; i++)
                {
                    int sum1 = 0, sum2 = 0;
                    for (int j = 0; j < n; j++)
                    {
                        sum1 += arr[i * n + j];
                        sum2 += arr[j * n + i];
                    }
                    if (new int[] { sum1, sum2 }.Any(x => x > n * n / 2 + 1)) return false;
                    sum3 += arr[i * n + i];
                    sum4 += arr[i * n + (n - i)];
                }
                if (new int[] { sum3, sum4 }.Any(x => x > n * n / 2 + 1)) return false;
                return true;
            }
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 nginx反向代理获取ip,java获取真实ip
  • ¥15 eda:门禁系统设计
  • ¥50 如何使用js去调用vscode-js-debugger的方法去调试网页
  • ¥15 376.1电表主站通信协议下发指令全被否认问题
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥15 复杂网络,变滞后传递熵,FDA
  • ¥20 csv格式数据集预处理及模型选择
  • ¥15 部分网页页面无法显示!
  • ¥15 怎样解决power bi 中设置管理聚合,详细信息表和详细信息列显示灰色,而不能选择相应的内容呢?
  • ¥15 QTOF MSE数据分析