Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
20 / 19 / 4
Регистрация: 22.03.2018
Сообщений: 701
1
.NET 4.x

Из-за чего неправильно решает судоку?

02.02.2019, 12:42. Показов 604. Ответов 4

Author24 — интернет-сервис помощи студентам
Помогите мне пожалуйста бду очень благодарен за риния спасибо !
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
using Microsoft.SolverFoundation.Solvers;
using System;
namespace Sudoku
{
    class Program
    {
        private static CspTerm[] GetSlice(CspTerm[][] sudoku, int Ra, int Rb, int Ca, int Cb)
        {
            CspTerm[] slice = new CspTerm[9];
            int i = 0;
            for (int row = Ra; row < Rb + 1; row++)
                for (int col = Ca; col < Cb + 1; col++)
                {
                    {
                        slice[i++] = sudoku[row][col];
                    }
                }
            return slice;
        }
        static void Main(string[] args)
        {
            Console.Title = "Программа для решения судоку.";
            Console.ForegroundColor = ConsoleColor.Green;
            Console.BackgroundColor = ConsoleColor.Black;
            Console.SetWindowSize(Console.LargestWindowWidth - 3, Console.LargestWindowHeight - 2);
            Console.Write("************************************************************************************************");
            Console.Write("\nУсловие программы: " +
                          "Судоку размера n называется квадрат со стороной n2, разделенный на n2" +
                          "\nсредних квадратов со стороной n, каждый из которых разделен на n2 маленьких квадратов." +
                          "\nВ каждом маленьком квадрате записано число от 1 до n2." +
                          "\nСудоку называется правильным, если в каждом столбце," +
                          "\nкаждой строке и каждом среднем квадрате встречаются все числа от 1 до n2." +
                          "\nНедавно Вася нарисовал Судоку размера n." +
                          "\nВаша задача – помочь ему определить правильный ли он.");
            Console.ForegroundColor = ConsoleColor.White;
            Console.WriteLine("\n************************************************************************************************");
 
            Console.ForegroundColor = ConsoleColor.Red;
            Console.Write("Введите ширину судоку: ");
            int N = Convert.ToInt32(Console.ReadLine());
 
            Console.ForegroundColor = ConsoleColor.Green;
            Console.Write("Введите высоту судоку: ");
            int M = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("");
            if (N == M)
            {
                int[,] B = new int[N, M];
 
                for (int row = 0; row < B.GetLength(0); row++)
                {
 
                    for (int col = 0; col < B.GetLength(1); col++)
                    {
                        if (B[row, col] == 0)
                        {
                            Console.ForegroundColor = ConsoleColor.Yellow;
                        }
                        {
                            Console.Write($"Введите [{row + 1} - строку {col + 1} - столбец] - ");
                            B[row, col] = byte.Parse(Console.ReadLine());
                        }
                    }
                }
                Console.WriteLine("\nИсходные данные нашего судоку:");
                for (int row = 0; row < M; row++)
                {
 
                    for (int col = 0; col < N; col++)
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.Write(B[row, col] + "\t");
                    }
                    Console.WriteLine();
                }
 
                ConstraintSystem S = ConstraintSystem.CreateSolver();
                CspDomain Z = S.CreateIntegerInterval(1, 9);
                CspTerm[][] sudoku = S.CreateVariableArray(Z, "cell", 9, 9);
                for (int row = 0; row < N; row++)
                {
                    for (int col = 0; col < M; col++)
                    {
                        if (B[row, col] > 0)
                        {
                            S.AddConstraints(S.Equal(B[row, col], sudoku[row][col]));
                        }
                    }
                    S.AddConstraints(S.Unequal(GetSlice(sudoku, row, row, 0, 8)));
                }
                for (int col = 0; col < 9; col++)
                {
                    S.AddConstraints(S.Unequal(GetSlice(sudoku, 0, 8, col, col)));
                }
                for (int a = 0; a < 3; a++)
                {
                    for (int b = 0; b < 3; b++)
                    {
                        S.AddConstraints(S.Unequal(GetSlice(sudoku, a * 3, a * 3 + 2, b * 3, b * 3 + 2)));
                    }
                }
                Console.WriteLine("\nРешение судоку:");
                ConstraintSolverSolution soln = S.Solve();
                object[] h = new object[9];
                for (int row = 0; row < N; row++)
                {
                    if ((row % 3) == 0)
                        for (int col = 0; col < M; col++)
                        {
                            soln.TryGetValue(sudoku[row][col], out h[col]);
                        }
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine($"{h[0]}\t{h[1]}\t{h[2]}\t{h[3]}\t{h[4]}\t{h[5]}\t{h[6]}\t{h[7]}\t{h[8]}");
                }
            }
            else if (N != M)
            {
                Console.WriteLine($"Судоку не может быть размером {N} на {M} то есть прямоугольной формы.");
            }
            {
                Console.ForegroundColor = ConsoleColor.White;
                Console.WriteLine("\nПрограмма завершена, нажмите любую клавишу . . .");
                Console.ReadKey();
            }
        }
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.02.2019, 12:42
Ответы с готовыми решениями:

Код неправильно решает уравнение
Помогите пожалуйста решить уравнение. Нам дано x,y,z нужно решить уравнение. Нужно чтобы сошлось с...

Программа решает уравнение неправильно
var a,b,x:real; begin readln(a,b,x); if a = 0 then if b = 0 then write ('любое число') else...

Неправильно решает обратные тригонометрические функции (acos, asin)
Здравствуйте. Обнаружил у себя проблему с нахождением acos. Вот что выдает: acos(0)=1.571. Хотя по...

Вот чего я добился теперь, но не верно решает:
//--------------------------------------------------------------------------- #include &lt;vcl.h&gt;...

4
20 / 19 / 4
Регистрация: 22.03.2018
Сообщений: 701
02.02.2019, 14:35  [ТС] 2
Если нужна библиотека то вот держите Microsoft.Solver.Foundation.7z
0
20 / 19 / 4
Регистрация: 22.03.2018
Сообщений: 701
02.02.2019, 15:31  [ТС] 3
Сам исправил
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
using Microsoft.SolverFoundation.Solvers;
using System;
namespace Sudoku
{
    class Program
    {
        private static CspTerm[] GetSlice(CspTerm[][] sudoku, int Ra, int Rb, int Ca, int Cb)
        {
            CspTerm[] slice = new CspTerm[9];
            int i = 0;
            for (int row = Ra; row < Rb + 1; row++)
                for (int col = Ca; col < Cb + 1; col++)
                {
                    {
                        slice[i++] = sudoku[row][col];
                    }
                }
            return slice;
        }
 
        static void Main(string[] args)
        {
 
            Console.Title = "Программа для решения судоку.";
            Console.ForegroundColor = ConsoleColor.Green;
            Console.BackgroundColor = ConsoleColor.Black;
            Console.SetWindowSize(Console.LargestWindowWidth - 3, Console.LargestWindowHeight - 2);
            Console.Write("************************************************************************************************");
            Console.Write("\nУсловие программы: " +
                          "Судоку размера n называется квадрат со стороной n2, разделенный на n2" +
                          "\nсредних квадратов со стороной n, каждый из которых разделен на n2 маленьких квадратов." +
                          "\nВ каждом маленьком квадрате записано число от 1 до n2." +
                          "\nСудоку называется правильным, если в каждом столбце," +
                          "\nкаждой строке и каждом среднем квадрате встречаются все числа от 1 до n2." +
                          "\nНедавно Вася нарисовал Судоку размера n." +
                          "\nВаша задача – помочь ему определить правильный ли он.");
            Console.ForegroundColor = ConsoleColor.White;
            Console.WriteLine("\n************************************************************************************************");
 
            Console.ForegroundColor = ConsoleColor.Red;
            Console.Write("Введите ширину судоку: ");
            int N = Convert.ToInt32(Console.ReadLine());
 
            Console.ForegroundColor = ConsoleColor.Green;
            Console.Write("Введите высоту судоку: ");
            int M = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("");
          if (N == M)
          {
                int[,] B = new int[N, M];
 
            for (int row = 0; row < B.GetLength(0); row++)
            {
 
                for (int col = 0; col < B.GetLength(1); col++)
                {
                    if (B[row, col] == 0)
                    {
                        Console.ForegroundColor = ConsoleColor.Yellow;
                    }
                    {
                        Console.Write($"Введите [{row + 1} - строку {col + 1} - столбец] - ");
                        B[row, col] = byte.Parse(Console.ReadLine());
                    }
                }
            }
 
            Console.WriteLine("\nИсходные данные нашего судоку:");
            for (int row = 0; row < B.GetLength(0); row++)
            {
 
                for (int col = 0; col < B.GetLength(1); col++)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.Write(B[row, col] + "\t");
                }
                Console.WriteLine();
            }
 
            ConstraintSystem S = ConstraintSystem.CreateSolver();
            CspDomain Z = S.CreateIntegerInterval(1, 9);
            CspTerm[][] sudoku = S.CreateVariableArray(Z, "cell", 9, 9);
            for (int row = 0; row < B.GetLength(0); row++)
            {
                for (int col = 0; col < B.GetLength(1); col++)
                {
                    if (B[row, col] > 0)
                    {
                        S.AddConstraints(S.Equal(B[row, col], sudoku[row][col]));
                    }
                }
                S.AddConstraints(S.Unequal(GetSlice(sudoku, row, row, 0, 8)));
            }
            for (int col = 0; col < B.GetLength(1); col++)
            {
                S.AddConstraints(S.Unequal(GetSlice(sudoku, 0, 8, col, col)));
            }
            for (int a = 0; a < 3; a++)
            {
                for (int b = 0; b < 3; b++)
                {
                    S.AddConstraints(S.Unequal(GetSlice(sudoku, a * 3, a * 3 + 2, b * 3, b * 3 + 2)));
                }
            }
            Console.WriteLine("\nРешение судоку:");
            ConstraintSolverSolution soln = S.Solve();
            object[] h = new object[9];
            for (int row = 0; row < B.GetLength(0); row++)
            {
                if ((row % 3) == 0) Console.WriteLine();
                for (int col = 0; col < B.GetLength(1); col++)
                {
                    soln.TryGetValue(sudoku[row][col], out h[col]);
                }
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine($"{h[0]}\t{h[1]}\t{h[2]}\t{h[3]}\t{h[4]}\t{h[5]}\t{h[6]}\t{h[7]}\t{h[8]}");
            }
          }
            else if (N != M)
            {
                Console.WriteLine($"Судоку не может быть размером {N} на {M} то есть прямоугольной формы.");
            }
            {
                Console.ForegroundColor = ConsoleColor.White;
                Console.Write("\nПрограмма завершена, нажмите любую клавишу . . .  ");
                Console.ReadKey();
            }
        }
    }
}
Добавлено через 31 минуту
Вот так вот задашь вопрос на форум программистов и сам программистом становишься
0
OwenGlendower
02.02.2019, 17:26
  #4

Не по теме:

Цитата Сообщение от Nikita110001 Посмотреть сообщение
Вот так вот задашь вопрос на форум программистов и сам программистом становишься
Хочешь сказать что ты не программист?

0
20 / 19 / 4
Регистрация: 22.03.2018
Сообщений: 701
02.02.2019, 18:03  [ТС] 5
Я программист
0
02.02.2019, 18:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.02.2019, 18:03
Помогаю со студенческими работами здесь

Переделать обычное судоку в судоку чёт-нечёт
Здравствуйте. Помогите, пожалуйста, переделать обычное судоку 9х9 в судоку чёт-нечёт. Отличие...

Чего я наделал неправильно?
пишу следующий код Private Sub GO_Click() Dim rst As Recordset Dim strSql As String strSql =...

Проверьте задачку по циклам, неправильно работает. [думаю что неправильно]
Спасибо что решили зайти. Задание выгладит так: http://*******/PW95p А результат выплнения:...

Неправильно работает цикл for, и функции работают неправильно
1) Неправильно работает цикл for(k=0...). Входит только 1 раз, дальше вылетает. Делал пошаговую...

Не решает систему ДУ
Доброго времени суток. Не пинайте, пожалуйста, сильно, в WM я очень плохо разбираюсь, но ситуация...

Не решает математику
Цель - решать примеры всего лишь используя только TextBox1 и кнопку &quot;равно&quot;(назовём ее button1)....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru