1 / 1 / 0
Регистрация: 14.08.2012
Сообщений: 14

Судоку, функция проверки на валидность

23.08.2012, 17:16. Показов 8520. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, Семпаи. Я новичок в программировании и в частности в освоении языка Питон, так что не судите строго. Вопрос нынче такой: в классе судоку пытаюсь написать функцию, которая проверяет цифру подставленную в ячейку на соответствие 3-м правилам заполнения головоломки.
1) нет совпадений в строке
2) нет совпадений в столбце
3) нет совпадений квадрате 3х3 в котором находится ячейка с цифрой

С первыми двумя правилами вроде нет проблем
Python
1
2
3
4
5
6
7
    def IsLegal(self, cell, v):  #cell - координаты пустой ячейки, v - подставляемая в ячейку цифра
        for i in range(self.numberOfColumns):
            if v == self.grid[cell[0]][i]:
                return False
        for j in range(self.numberOfRows):
            if v == self.grid[j][cell[1]]:
                return False
Но хоть убей, в голову не приходит элегантный алгоритм проверки на совпадение в квадрате 3х3. Только громоздкие варианты типа сохранения квадратов 3х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
bool CheckSudoku(BYTE ** pData) // проверка правильности заполнения
{
    CSudokuSet set;
 
    for (int iRow = 0; iRow < 9; iRow++)
    {
        set.Clear();
        for(int iCol = 0; iCol < 9; iCol++)
        {
            if (pData[iRow][iCol] == 0) continue;
            if (! set.Set(pData[iRow][iCol])) return false;
        }
    }
 
    for (int iCol = 0; iCol < 9; iCol++)
    {
        set.Clear();
        for(int iRow = 0; iRow < 9; iRow++)
        {
            if (pData[iRow][iCol] == 0) continue;
            if (! set.Set(pData[iRow][iCol])) return false;
        }
    }
 
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
        {
            set.Clear();
 
            for (int iCol = 0; iCol < 3; iCol++)
                for(int iRow = 0; iRow < 3; iRow++)
                {
                    if (pData[i*3 + iRow][j*3 + iCol] == 0) continue;
                    if (! set.Set(pData[i*3 + iRow][j*3 + iCol])) return false;
                }
        }
 
    return true;
}
Так что, семпаи, вся надежда только на ваши подсказки.
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.08.2012, 17:16
Ответы с готовыми решениями:

Некорректно работает код по проверки прокси на валидность
Здравствуйте, написал подобие &quot;прокси чекера&quot; для проверки +- 28к прокси. В чём суть проблемы, ни один ip не является валидным, хотя если...

Судоку. Функция проверки
пишу судоку на action script 2 рэндомизацию цифр реализовал. цифры находятся в экземплярах компоненты TextInput. названы они ....

Ищу скрипт для проверки аккаунтов ВКонтакте на валидность!
Нужен php скрипт , который мог бы прочекать акк и если он валиден записать в фаил! Очень прошу , ищу уже две недели...

5
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
24.08.2012, 01:55
должно быть одно поле и координаты каждого квадрата на поле
для установки значения поле получает координаты ячейки и цифру
сначала проверяется ряд на поле, потом колонка на поле
потом определяется квадрат и проверяется
0
1 / 1 / 0
Регистрация: 14.08.2012
Сообщений: 14
24.08.2012, 12:40  [ТС]
Цитата Сообщение от accept Посмотреть сообщение
должно быть одно поле и координаты каждого квадрата на поле
для установки значения поле получает координаты ячейки и цифру
сначала проверяется ряд на поле, потом колонка на поле
потом определяется квадрат и проверяется
Вроде это ровно тот алгоритм, который я и описал. По крайней мере я не понял в чём разница. А не могли бы вы прочитать код на С++, что я привёл выше. Я не могу понять зачем там аж 4 цикла по 3 итеррации в каждом, как он работает?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
24.08.2012, 13:53
Цитата Сообщение от AntyLINK Посмотреть сообщение
По крайней мере я не понял в чём разница.
где у тебя координаты квадратов ?

Цитата Сообщение от AntyLINK Посмотреть сообщение
А не могли бы вы прочитать код на С++, что я привёл выше.
это не весь код, большинство элементов определены где-то выше

для того, чтобы перебрать подмассив, никакие коды не нужны
0
16 / 2 / 0
Регистрация: 10.06.2011
Сообщений: 17
25.08.2012, 14:46
Python
1
2
3
4
5
6
7
def IsLegal(self, cell, v):  #cell - координаты пустой ячейки, v - подставляемая в ячейку цифра
        for i in range(self.numberOfColumns):
            if v == self.grid[cell[0]][i]:
                return False
        for j in range(self.numberOfRows):
            if v == self.grid[j][cell[1]]:
                return False
Элегантнее в Питон - когда нет for <i> in <range(n)>:

Python
1
2
3
4
5
6
def IsLegal(self, cell, v):  #cell - координаты пустой ячейки, v - подставляемая в ячейку цифра
        first = [x for x in self.numberOfColumns if self.grid[cell[0]][x]==v]
        second = [x for x in self.numberOfRows if self.grid[x][cell[1]]==v]
        if first or second:
                return False
        return True
А насчет третьего условия - сча подумаем про элегантное=)

Добавлено через 59 минут
Вот код для третьей проверки:

Python
1
2
3
4
5
6
7
8
9
10
11
def third(self,cell,v):
  # возвращает True - если цифра есть в блоке
  a = [[0,1,2],[3,4,5],[6,7,8]]
  x = [i for i in xrange(3) if cell[0] in a[i]]
  y = [i for i in xrange(3) if cell[1] in a[i]]
  if not(x and y):
    return None
  g = [True in i for i in [[[v] == grid[j][i] for j in a[y[0]]] for i in a[x[0]]]]
  if True in g:
    return True
  return False

Проверял код - этим:
Python
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
# -*- coding: utf-8 -*-
 
grid = [[[0],[2],[2],  [3],[4],[5],  [6],[7],[8]],
        [[1],[3],[4],  [5],[6],[7],  [8],[9],[0]],
        [[1],[2],[4],  [5],[6],[7],  [8],[9],[0]],
 
        [[1],[2],[3],  [5],[6],[7],  [8],[9],[0]],
        [[1],[2],[3],  [4],[6],[7],  [8],[9],[0]],
        [[1],[2],[3],  [4],[5],[7],  [8],[9],[0]],
        
        [[1],[2],[3],  [4],[5],[6],  [8],[9],[0]],
        [[1],[2],[3],  [4],[5],[6],  [7],[9],[0]],
        [[1],[2],[3],  [4],[5],[6],  [7],[8],[0]]]
 
def third(cell,v):
  global grid
  a = [[0,1,2],[3,4,5],[6,7,8]]
  x = [i for i in xrange(3) if cell[0] in a[i]]
  y = [i for i in xrange(3) if cell[1] in a[i]]
  if not(x and y):
    return None
  g = [True in i for i in [[[v] == grid[j][i] for j in a[y[0]]] for i in a[x[0]]]]
  if True in g:
    return True
  # for i in h:
  #   if True in i:return True
  return False
 
print third([2,3],3)
Поправляйте ежели не так.
ЗЫ писал на коленке =)
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
27.08.2012, 02:08
Цитата Сообщение от Anth Посмотреть сообщение
Python
1
2
3
4
5
6
def IsLegal(self, cell, v):  #cell - координаты пустой ячейки, v - подставляемая в ячейку цифра
        first = [x for x in self.numberOfColumns if self.grid[cell[0]][x]==v]
        second = [x for x in self.numberOfRows if self.grid[x][cell[1]]==v]
        if first or second:
                return False
        return True
1) там ошибка: нет range()
2) если на первом элементе ряда всё стало ясно, то нужно сразу вернуть значение из функции
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.08.2012, 02:08
Помогаю со студенческими работами здесь

Переделать программу проверки решения судоку из C++ в Python
Получилось реализовать с CMake 5-ю файлами. main.cpp #include &lt;iostream&gt; #include &quot;checking.h&quot; int main() { cout &lt;&lt;...

Двумерный массив, нужны проверки для игры Судоку
я вчера задал этот вопрос но ответв не получил . пожалуйста посмотрите и помогите ...

Алгоритм проверки судоку (двумерный массив текст боксов)
Здравствуйте, есть открытый вопрос, во-первых один из главных, как на c# сделать проверку судоку? У меня данные беруться из текст боксов, и...

Как добавить данные из textBox1 и textBox2 в БД MySQL после проверки на валидность
Нужно добавить textBox1.Text и textBox2.Text в mysql после проверки помогите. Вот код using System; using...

Судоку. Алгоритм проверки наличия цифры в отдельных блоке, строке, столбце
Здравствуйте, по какому алгоритму лучше всего проверять наличие введенной цифры в отдельных блоке, строке, столбце? Что будет эффективнее...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru