using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace testsd
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 9, j = 9;
            int[,] arr = new int[i, j];
            Console.Write("输入原始数独数字" + "\n");
            int m = 1, n = 1;
            bool result = true;
            bool test = true;
        ID:
            while (result == true)
            {
                //控制台输入行数
                Console.WriteLine("输入数独对应行数");                string input1 = Console.ReadLine();
                m = Convert.ToInt32(input1);     //将输入转换成行数
                //Console.WriteLine(input1);                //控制台输入列数
                Console.WriteLine("输入数独对应列数");                string input2 = Console.ReadLine();
                n = Convert.ToInt32(input2);     //将输入转换成列数
                // Console.WriteLine(input2);                //控制台输入对应数值
                Console.WriteLine("输入数独对应数值");                string input = Console.ReadLine();     //控制台输入一个整数
                int data = Convert.ToInt32(input);     //将输入转换成整数
                arr[m - 1, n - 1] = data;
                //Console.WriteLine(data);
                //判断是否输入下一个数值yes或no或输入错误
                while (test == true)
                {
                    //控制台选择输入下一个数值                    Console.WriteLine("选择是否输入下一个数值");                    string input3 = Console.ReadLine();
                    Console.Write(input3);                    if (input3 == "yes")
                    {
                        Console.WriteLine("输入下一个数值");
                        goto ID;
                    }
                    else if (input3 == "no")
                    {
                        result = false;
                        Console.WriteLine("进行下一步");
                        test = false;
                    }
                    else
                    {
                        Console.WriteLine("输入错误,请重新输入");                    }
                }
            }            // Console.WriteLine("显示二维数组");            //显示生成的二位数组数据的数值
            for (int m1 = 0; m1 < 9; m1++)
            {
                for (int n1 = 0; n1 < 9; n1++)
                {
                    Console.Write(arr[m1, n1] + "");
                }
                Console.WriteLine();
            }
            Console.WriteLine("所输入的二维数组");
            Console.ReadLine();            //数独执行添加条件            //数独执行添加条件
            int h = 0, k = 0;
        ID1:            for (h = 0; h < 9; h++)
            {
                for (k = 0; k < 9; k++)
                {
                    if (arr[h, k] != 0) { continue; }
                    else
                    {                        for (int g = 1; g <= 10; g++)
                        {
                            arr[h, k] = g;
                            bool test1 = true;
                            while (test1 == true)   //检测数值是否符合数独规则
                            {                                int num = arr[h, k];
                                int[] query = new int[9] { 0, 0, 0, 3, 3, 3, 6, 6, 6 };
                                int t, u;
                                //每一行每一列是否重复
                                bool result1 = true;
                                while (result1 == true)
                                {
                                    for (t = 0; t < 9; t++)
                                    {
                                        if ((t != h && arr[t, k] == num) || (t != k && arr[h, t] == num))
                                            result1 = false;
                                    }
                                    //每个九宫格是否重复
                                    for (t = query[h]; t < query[h] + 3; t++)
                                    {
                                        for (u = query[k]; u < query[k] + 3; u++)
                                        {
                                            if ((t != h || u != k) && arr[t, u] == num)
                                                result1 = false;
                                        }
                                    }
                                }
                                test1 = false;                            }
                        }
                        //判断数值是否完成填写,如果没有恢复数值为0重新操作;
                        bool tet = true;
                        while (tet == true)
                        {
                            if (arr[h, k] >= 10) arr[h, k] = 0;
                            else { tet = false; }
                        }
                    }
                }            }            //检测数组是否为0;
            bool ch = true;
            while (ch == true)
            {
                if (arr[h, k] == 0) goto ID1;
                else
                {
                    continue;
                }            }            //显示计算生成的二位数组数据的数值
            for (int m1 = 0; m1 < 9; m1++)
            {
                for (int n1 = 0; n1 < 9; n1++)
                {
                    Console.Write(arr[m1, n1] + "");
                }
                Console.WriteLine();
            }
            Console.WriteLine("计算生成的二维数组");
            Console.ReadLine();        }
            }
   }实现功能:
1:自动录入随机数独的所对应行列数值;
2:显示录入的数独;
3:根据数独规则生成未录入行列的数值;
目前1,2功能实现,3功能没整出来。大侠们帮忙看下上面的问题呢!

解决方案 »

  1.   


    static int[,] pu = new int[9, 9];      static void Main(string[] args)
            {                   
                    int m=1,n=1;
                    bool result = true;
                    while (result == true)
                    {
                        //控制台输入行数
                        Console.WriteLine("输入数独对应行数");
                        string input1 = Console.ReadLine();
                        m = Convert.ToInt32(input1);     //将输入转换成行数       
                        //控制台输入列数
                        Console.WriteLine("输入数独对应列数");
                        string input2 = Console.ReadLine();
                        n = Convert.ToInt32(input2);     //将输入转换成列数                    //控制台输入对应数值
                        Console.WriteLine("输入数独对应数值");
                        string input = Console.ReadLine();     //控制台输入一个整数
                        int data = Convert.ToInt32(input);     //将输入转换成整数
                        pu[m - 1, n - 1] = data;
                       
                        //判断是否输入下一个数值yes或no或输入错误
                        bool test = true;
                        while (test == true)
                        {
                            //控制台选择输入下一个数值
                            Console.WriteLine("选择是否输入下一个数值");
                            string input3 = Console.ReadLine();                        if (input3 == "yes")
                            {
                                Console.WriteLine("输入下一个数值");
                                test=false;
                                break;
                            }
                            else if (input3 == "no")
                            {
                                result = false;
                                Console.WriteLine("进行下一步");
                                test = false;
                                break;
                            }
                            else
                            {
                                Console.WriteLine("输入错误,请重新输入");         
                
                            }
                        }
                    }
                Show();
                GetAnswer(0);
                Console.ReadLine();
            }
            /// 验证函数
            static bool IsValid(int i, int j)
            {
                int n = pu[i, j];
                int[] query = new int[9] { 0, 0, 0, 3, 3, 3, 6, 6, 6 };
                int t, u;            //每一行每一列是否重复            for (t = 0; t < 9; t++)
                {
                    if ((t != i && pu[t, j] == n) || (t != j && pu[i, t] == n))
                        return false;
                }
                //每个九宫格是否重复            for (t = query[i]; t < query[i] + 3; t++)
                {
                    for (u = query[j]; u < query[j] + 3; u++)
                    {
                        if ((t != i || u != j) && pu[t, u] == n)
                            return false;
                    }
                }
                return true;
            }
            /// 显示函数
            static void Show()
            {
                for (var i = 0; i < 9; i++)
                {
                    for (var j = 0; j < 9; j++)
                    {
                        Console.Write(pu[i, j] + " ");
                    }
                    Console.WriteLine();
                }
                Console.WriteLine("----------------------------------------------");
            }        /// 使用回溯算法求解
            static void GetAnswer(int n)
            {
               if (n == 81)
                {//是否已经是最后一个格子
                   Show();
                    return;
                }
                int i = n / 9, j = n % 9;
                if (pu[i, j] != 0)
                {//如果当前格子不需要填数字,就跳到下一个格子
                    GetAnswer(n + 1);
                    return;
                }
                for (int k = 0; k < 9; k++)
                {
                   pu[i, j]++;//当前格子进行尝试所有解
                    if (IsValid(i, j))
                        GetAnswer(n + 1);//验证通过,就继续下一个
                }
                pu[i, j] = 0; //如果上面的单元无解,还原,就回溯
                return;
            } 挂了N久没人理会,郁闷。还得自己网上找的参考做的。