Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
159 / 104 / 124
Регистрация: 01.04.2014
Сообщений: 466
Записей в блоге: 7

Как победить Судоку

10.04.2014, 15:47. Показов 1798. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Предлагаю вашему вниманию программу Судока.
Она решает числовые головоломки с одноименным
названием среднего уровня сложности. Если эта
программа не может довести решение до конца, то
значит вы имеете дело с Судокой высокого уровня
сложности. Тут надо решать своей головой.
Вы можете скопировать эту программу и сохранить ее
Как FRM - файл. Потом запустите Бейсик и укажите
ему этот файл. Программа работает. Может кому и
понравится.

Visual Basic
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
VERSION 5.00
Begin VB.Form frmM 
   Caption         =   "Судоку"
   ClientHeight    =   6090
   ClientLeft      =   60
   ClientTop       =   450
   ClientWidth     =   8850
   Icon            =   "frmM.frx":0000
   LinkTopic       =   "Form1"
   MaxButton       =   0   'False
   ScaleHeight     =   406
   ScaleMode       =   3  'Pixel
   ScaleWidth      =   590
   StartUpPosition =   3  'Windows Default
   Begin VB.CommandButton cmdOpen 
      Caption         =   "Загрузить файл"
      BeginProperty Font 
         Name            =   "Times New Roman"
         Size            =   14.25
         Charset         =   204
         Weight          =   700
         Underline       =   0   'False
         Italic          =   0   'False
         Strikethrough   =   0   'False
      EndProperty
      Height          =   915
      Left            =   6600
      TabIndex        =   3
      Top             =   4500
      Width           =   1815
   End
   Begin VB.Timer tmrR 
      Enabled         =   0   'False
      Interval        =   400
      Left            =   9300
      Top             =   5400
   End
   Begin VB.CommandButton cmdD 
      Caption         =   "Поехали"
      BeginProperty Font 
         Name            =   "Times New Roman"
         Size            =   15.75
         Charset         =   204
         Weight          =   700
         Underline       =   0   'False
         Italic          =   0   'False
         Strikethrough   =   0   'False
      EndProperty
      Height          =   915
      Left            =   6600
      TabIndex        =   1
      Top             =   3000
      Width           =   1815
   End
   Begin VB.TextBox txtT 
      Alignment       =   2  'Center
      Appearance      =   0  'Flat
      BeginProperty Font 
         Name            =   "Microsoft Sans Serif"
         Size            =   21.75
         Charset         =   204
         Weight          =   700
         Underline       =   0   'False
         Italic          =   0   'False
         Strikethrough   =   0   'False
      EndProperty
      Height          =   615
      Index           =   0
      Left            =   90
      TabIndex        =   0
      Top             =   90
      Width           =   615
   End
   Begin VB.Label lblL 
      Alignment       =   2  'Center
      BeginProperty Font 
         Name            =   "Times New Roman"
         Size            =   18
         Charset         =   204
         Weight          =   700
         Underline       =   0   'False
         Italic          =   0   'False
         Strikethrough   =   0   'False
      EndProperty
      Height          =   465
      Left            =   6600
      TabIndex        =   2
      Top             =   750
      Width           =   1665
   End
   Begin VB.Shape Shape1 
      BackColor       =   &H00FFFFFF&
      FillColor       =   &H00C00000&
      FillStyle       =   0  'Solid
      Height          =   6045
      Left            =   0
      Top             =   0
      Width           =   6045
   End
End
Attribute VB_Name = "frmM"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Rem Эта программа решает Судоку
Rem она загружает судоку из файла Su.txt, который находится
Rem в текущем каталоге (где Exe-файл)
Rem текст в Su.txt должен выглядеть так (реальный пример)
 
Rem 010000080           (запись - строка за строкой)
Rem 460090053
Rem 000403000
Rem 007000200
Rem 040000030
Rem 008000500
Rem 000506000
Rem 680020071
Rem 030000040
 
Rem то есть вместо пустой клетки ставится 0 (нуль)
 
Option Explicit
Option Base 1
 
Dim i%, j%, k%, m%, n%, p%, q%, z%
Dim ind%, ik%, jk%, nm%, zp%, zq%
Dim O%(9, 9)
Dim Osch As Boolean
 
Private Sub cmdD_Click()
    For i = 0 To 80
        txtT(i).ForeColor = vbBlack
    Next i
    Call Copi(O())                           ' инициализация массива O()
    Call Fehler                                ' процедура ищет ошибку
    If Osch Then                              ' Osch=True - наличие ошибки
        tmrR.Enabled = True
        lblL.Caption = "Ошибка"
    End If
    Call Stroka                               ' Эти процедуры решают Судоку
    Call Stolbez
    Call Block
    Call Kletka
End Sub
 
Rem инициализация массива
Private Sub Copi(Yy%())
    For k = 0 To 80
        Call ijN(k, i, j)
        Yy(i, j) = Val(txtT(k).Text)
    Next k
End Sub
 
Rem процедура ищет: Нет ли где ошибки
Rem То есть проверяет все строки, столбцы и блоки
Rem Если есть две РАВНЫЕ цифры - ошибка!
Private Sub Fehler()
    Osch = False
    For i = 1 To 9
        For j = 1 To 9
            m = O(i, j)
            If m = 0 Then GoTo 100   ' Если поле пустое, переход на следующее
            
            n = 0                                          ' код для строки
            For k = 1 To 9
                If O(i, k) = m Then n = n + 1
            Next k
            If n > 1 Then
                Osch = True        ' Есть ошибка, значит
                Exit Sub             ' выход из процедуры
            End If
                
            n = 0                                         ' Столбец
            For k = 1 To 9
                If O(k, j) = m Then n = n + 1
            Next k
            If n > 1 Then
                Osch = True
                Exit Sub
            End If
                
            For k = 1 To 9                             ' проверка блока
                n = 0
                Call ijBlock(k, ik, jk)
                For p = ik To ik + 2
                    For q = jk To jk + 2
                        If O(p, q) = m Then n = n + 1
                    Next q
                Next p
                If n > 1 Then           ' число не одно - ошибка!!
                    Osch = True
                    Exit Sub
                End If
            Next k
100:
        Next j
    Next i
End Sub
 
Private Sub Stroka()
    For m = 1 To 9                      ' m - цифра
        For i = 1 To 9                    ' i - номер строки
            nm = 0                           ' столько раз можно поставить m
            For j = 1 To 9                ' j - номер столбца
                                    ' здесь цифра встречается - переходим к другой
                If O(i, j) = m Then GoTo 200
                                    ' здесь есть цифра, а нам надо пустое поле
                                    ' переходим на следующее поле
                If O(i, j) <> 0 Then GoTo 100
            
                For k = 1 To 9
                                      ' такая цифра есть, переход на следующее поле
                    If O(k, j) = m Then GoTo 100
                Next k
                                        ' функция вычисляет номер блока nBlock(i, j)
                                        ' процедура ijBlock() выдает начальные
                                        ' значения левого верхнего угла блока
                Call ijBlock(nBlock(i, j), ik, jk)
                                         ' двойной цикл (блок - не строка)
                For p = ik To ik + 2
                    For q = jk To jk + 2
                        If O(p, q) = m Then GoTo 100
                    Next q
                Next p
                nm = nm + 1
                z = j                           ' сохранение j
100:
            Next j
                                            ' если цифру можно поставить только
                                            ' один раз - то мы ее и ставим!!
            If nm = 1 Then Call SchH(i, z, m)
200:
        Next i
    Next m
End Sub
                                    Rem Эта процедура ПОЧТИ копия предыдущей
                                    Rem комментарии излишни
Private Sub Stolbez()
    For m = 1 To 9
        For j = 1 To 9
            nm = 0                           ' столько раз можно поставить m
            For i = 1 To 9
                If O(i, j) = m Then GoTo 200
                If O(i, j) <> 0 Then GoTo 100
            
                For k = 1 To 9
                    If O(i, k) = m Then GoTo 100
                Next k
          
                Call ijBlock(nBlock(i, j), ik, jk)
                For p = ik To ik + 2
                    For q = jk To jk + 2
                        If O(p, q) = m Then GoTo 100
                    Next q
                Next p
                nm = nm + 1
                z = i                         ' сохранение i
100:
            Next i
            If nm = 1 Then Call SchH(z, j, m)
200:
        Next j
    Next m
End Sub
                                            ' Почти тоже самое, НО
                                            ' сначала залается блок (переменная k)
                                            ' а далее все тоже самое
Private Sub Block()
    For m = 1 To 9
        For k = 1 To 9           ' здесь k - номер блока
            nm = 0
            Call ijBlock(k, ik, jk)
            For p = ik To ik + 2
                For q = jk To jk + 2
                    If O(p, q) = m Then GoTo 200
                    If O(p, q) <> 0 Then GoTo 100
                    
                    For n = 1 To 9
                        If O(n, q) = m Then GoTo 100
                    Next n
                    
                    For n = 1 To 9
                        If O(p, n) = m Then GoTo 100
                    Next n
                    nm = nm + 1
                    zp = p                         ' сохранение p, q
                    zq = q
100:
                Next q
            Next p
            If nm = 1 Then Call SchH(zp, zq, m)
200:
        Next k
    Next m
End Sub
 
Rem Суть этой процедуры проста:
Rem выбирается пустая (нулевая) клетка (пустое поле)
Rem и проверяется - Сколько цифр в нее можно поставит (!!)
Rem Если одну, то ее и ставим!!
Private Sub Kletka()
    For i = 1 To 9
        For j = 1 To 9
            If O(i, j) <> 0 Then GoTo 200
            nm = 0
            For m = 1 To 9
                For k = 1 To 9
                    If O(i, k) = m Then GoTo 100
                Next k
                
                For k = 1 To 9
                    If O(k, j) = m Then GoTo 100
                Next k
                
                Call ijBlock(nBlock(i, j), ik, jk)
                For p = ik To ik + 2
                    For q = jk To jk + 2
                        If O(p, q) = m Then GoTo 100
                    Next q
                Next p
                nm = nm + 1
                z = m                    ' сохранение m
100:
            Next m
            If nm = 1 Then Call SchH(i, j, z)
200:
        Next j
    Next i
End Sub
 
Private Sub cmdOpen_Click()            ' здесь все просто: загрузка данных
Dim Ss As String, Sd As String
    On Error GoTo 777
    Open "Su.txt" For Input As #1
    For i = 1 To 9
        Line Input #1, Ss
        For j = 1 To 9
            Sd = Mid(Ss, j, 1)
            If Sd = "0" Then txtT(Nij(i, j)).Text = " " Else txtT(Nij(i, j)).Text = Sd
        Next j
    Next i
    Close #1
    Exit Sub
777:                    ' Обработка ошибки
    lblL.Caption = "Su.txt??"
End Sub
 
Rem Создается текстовое поле txtT(0)
Rem Остальные поля загружаются динамически
Rem Нулевое поле не может быть дважды загружено
Private Sub Form_Load()
    For i = 1 To 9
        For j = 1 To 9
            ik = Choose(i, 6, 9, 12, 17, 20, 23, 28, 31, 34)
            jk = Choose(j, 6, 9, 12, 17, 20, 23, 28, 31, 34)
            ind = Nij(i, j)
            If ind = 0 Then GoTo 100             ' Это поле уже загружено
            Load txtT(ind)
            txtT(ind).Left = 40 * (j - 1) + jk
            txtT(ind).Top = 40 * (i - 1) + ik
            txtT(ind).Visible = True
100:
        Next j
    Next i
End Sub
                                                      ' ставит цифру в нужное место
                                                      ' и отмечает ее красным цветом
Private Sub SchH(ni%, nj%, nn%)
    txtT(Nij(ni, nj)).ForeColor = vbRed
    txtT(Nij(ni, nj)).Text = nn
End Sub
 
Rem вычисляет номер блока по координатам клетки
Private Function nBlock(ii%, jj%) As Integer
    nBlock = 3 * Fix((ii - 1) / 3) + Fix((jj - 1) / 3) + 1
End Function
 
Rem определяет по номеру блока левый верхний угол
Private Sub ijBlock(kk%, ii%, jj%)
    ii = Choose(kk, 1, 1, 1, 4, 4, 4, 7, 7, 7)
    jj = Choose(kk, 1, 4, 7, 1, 4, 7, 1, 4, 7)
End Sub
                                         ' вычисляет индекс текстового поля
Private Function Nij(ii As Integer, jj As Integer) As Integer
    Nij = 9 * (ii - 1) + jj - 1
End Function
                                         ' процедура обратная  функции Nij()
Private Sub ijN(kk%, ii%, jj%)
    ii = Int(kk / 9) + 1
    jj = kk Mod 9 + 1
End Sub
                                                     ' без комментариев
Private Sub tmrR_Timer()
    If lblL.ForeColor = vbBlack Then
        lblL.ForeColor = vbRed
    Else
        lblL.ForeColor = vbBlack
    End If
End Sub
 
Private Sub txtT_Change(Index As Integer)
    lblL.Caption = ""
    lblL.ForeColor = vbBlack
    tmrR.Enabled = False
End Sub
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.04.2014, 15:47
Ответы с готовыми решениями:

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

Как победить IE 11?
Камрады, помогите, пожалуйста, победить IE 11. Говорю сразу - ламер, без специального образования, просто захотелось сделать самому сайт,...

Как победить окирпичивание?
Всем привет! Суть проблемы: - телефон JIAYU G2 1GB RAM. Служил мне верой и правдой &gt; 2-х лет, и настал момент ужасный, что однажды не...

11
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
10.04.2014, 20:15
Цитата Сообщение от gehh Посмотреть сообщение
Вы можете скопировать эту программу и сохранить ее
Как FRM - файл
На нашем форуме можно прикреплять проекты.
0
159 / 104 / 124
Регистрация: 01.04.2014
Сообщений: 466
Записей в блоге: 7
11.04.2014, 07:47  [ТС]
Я понял, что вы предлагает, но не знаю, как это делать.
0
 Аватар для Апострофф
9908 / 3924 / 742
Регистрация: 11.10.2011
Сообщений: 5,904
11.04.2014, 08:01
Цитата Сообщение от gehh Посмотреть сообщение
но не знаю, как это делать
Выделить файлы проекта в проводнике, ПКМ, отправить > Сжатая Zip-папка, и сюда
1
159 / 104 / 124
Регистрация: 01.04.2014
Сообщений: 466
Записей в блоге: 7
11.04.2014, 08:13  [ТС]
Спасибо!
В следующий раз я поступлю именно так!!
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
27.04.2014, 19:28
Цитата Сообщение от gehh
но не знаю, как это делать
Я немного помог ...
правда ничего не понял кто кого побеждает ?...
Миниатюры
Как победить Судоку  
Вложения
Тип файла: zip FrmM.zip (3.4 Кб, 17 просмотров)
1
159 / 104 / 124
Регистрация: 01.04.2014
Сообщений: 466
Записей в блоге: 7
27.04.2014, 19:51  [ТС]
Спасибо! Я полагал, что на киберфоруме никого такая
вещь, как Судока не интересует и даже забыл об этой программе.
Ещё раз спасибо!
P.S. откуда вы ее раскопали?
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
27.04.2014, 20:11
Цитата Сообщение от gehh Посмотреть сообщение
P.S. откуда вы ее раскопали?
я за вами слежу...

Не по теме:

...шутка, случайно наткнулся, искал другое, решил помочь

1
 Аватар для Апострофф
9908 / 3924 / 742
Регистрация: 11.10.2011
Сообщений: 5,904
27.04.2014, 21:01
Цитата Сообщение от gehh Посмотреть сообщение
Я полагал, что на киберфоруме никого такая
вещь, как Судока не интересует
Зря так полагали - Расстановка случайных чисел в массиве 9х9, по правилам судоку)
1
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
27.04.2014, 21:17
Цитата Сообщение от Апострофф Посмотреть сообщение
Зря так полагали -
gehh, это еще что...
мне попадалась такая табличка шахматы на бейсике ...
правда не уверен может приснилось...

зная что вы придерживаетесь доктрины интелекта ..
полагаю вам это будет полезно найти на этом форуме в ветках бейсика.
ищщите....
1
 Аватар для Апострофф
9908 / 3924 / 742
Регистрация: 11.10.2011
Сообщений: 5,904
27.04.2014, 21:22
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
ищщите....
Нашёл
1
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
27.04.2014, 21:26
Gehh, наверное вам нужно срочно подружиться с пользователем KoGG-..аном..
только не пугайте его так сразу ... что вы намереваетесь делать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.04.2014, 21:26
Помогаю со студенческими работами здесь

Как победить кавычки "?
Делаю небольшую выборку Set coll=db.Search(|Form=&quot;f_pr_act&quot; &amp; fld_filial=&quot;|+filial+|&quot; &amp; fld_client=&quot;|+client+|&quot;|,Nothyng,32000) Но...

Ну как же победить UTF-8?
Ничего не понимаю. Каждый раз одно и тоже, когда пытаюсь работать с UTF-8. В итоге, результат я конечно получаю, но мне уже надоело...

Как победить таблицу?
Каталог товара выводится в виде таблицы, причем в верхней строке рядом с названием столбца стоят две графические стрелки – одна вверх, а...

Как победить VPN?
Приветствую всех! Подскажите, может кто в курсе. Такая проблема. Я сделал из старого компьютера сервер. Поставил на него прокси,...

Как победить жадность?
Как победить жадность?


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru