sudoku matlab

boas pessoal
tenho um grande problema...nao sei como escrever as regras para os numeros nao me repetirem nas linhas e nas colunas.
o que ja tnh feito é o seguinte...

Código:
function [s,ss]=sudoku_(n)
s=zeros(9);
N=81;
for i=1:N, 
n=round(8*rand()+1);
x=round(8*rand()+1);
y=round(8*rand()+1);
s(x,y)=n;
 
end


agora nao sei o k fazer aseguir a isto.
alguem pode dar uma ajudazita?
desde ja agradecido
um abraço
 
Última edição pelo moderador:
para não se repetirem nas linhas e nas colunas, apenas tens que fazer dois fores, encadeados, ou seja um dentro do outro. com eles percorrer a linha (coluna), e para cada linha (coluna) percorres a sua coluna (linha) e verificas se tem elementos iguais. Não existe grande dificuldade nesse caso.
 
Nao sei bem o que faz o código que colocaste em cima, já que não te deste ao trabalho de explicar, para nos sabermos responder devidamente.

Mas podes verificar se existem casas com valor repetido, percorrendo cada uma das linhas 1-9 e para cada uma dessas linhas percorrer as suas colunas (ou vice-versa), e dentro disto percorres novamente as linhas e as colunas, para poderes comparar se existem (i,j) e (k,h) nos quais os valores sao iguais, o que nao pode acontecer. serão entao 4 for's (não dois como eu tinha mensionado). Sendo que se i=k e j=h não é erro uma vez que representa o mesmo valor.

Código:
for (int i=0; i<9; i++)
        {
            for (int j=0;j<9; j++)
            {
                for (int k=0; k<9; k++)
                {
                    for (int h=0; h<9; h++)
                    {

                        if ( tabela[i,j]) == tabela[k,h] )
                        {
                            if (i!=k || j!=h)
                            {
                                           SE CHEGOU AQUI HA IMCOMPATIBILIDADE entre i,k  e  j,h
                            }
                        }
                    }
                        
                }
            }
        }
Isto serve para verificar erros (escrevi em c++), se é isso que queres, só tens que passar para matlab que não é dificil :P (se é algo disto que realmente precisas).
 
Última edição:
Código:
function [s,ss]=sudoku_(n)
 
s=zeros(9); cria uma matriz de zeros 9*9
N=15; variavel
for i=1:N, vai fazer o ciclo de 1 ate N
n=round(8*rand()+1); gera um numero aleatorio entre 1 e 9
x=round(8*rand()+1); gera um numero aleatorio entre 1 e 9
y=round(8*rand()+1); gera um numero aleatorio entre 1 e 9
s(x,y)=n; vai colocar o valor de n nas cordenadas x e y na matriz
 
end

agora preciso que ele nao gere numeros nas mesma coordenadas e que nao se repitam nas linhas e nas colunas.

é assim eu nao percebo patavina de c++, obrigado pela ajuda. se conseguires passar isso para c agradecia pq acho que sao linguagens parecidas. achas que seras capaz de me ajudar ainda mais

um abraço
 
para C. Ok eu ajudo...



Ta quase....




:tareon:



Mais um pouco.....


ta no fim....

e.........


Prontos já está. Aquele códio chama-lhe o que quiseres, mas entre c++ e c é o mesmo.

Alias acho que minto... tens que declarar as variaveis fora dos for's, de resto.....
 
duas opções:

Pegas nuns livrinhos, numas sebentas e pesquisas na net sobre matlab, e como programar... ciclos, variaveis... bla bla bla.

OU

Vens aqui perguntar como se faz.

Que não saibas e tenhas problemas a pensar num algoritmo ou outro, ok.. parece.me bem pedir ajuda, que à muita boa gente pronta para ajudar.


Tinha ficado melhor pegares em qualquer coisa, tentares e vinhas aqui e escrias: Isto não dá por isto e por aquilo e bla bla blaaa...

Faço-me entender?

Um abraço e da aí umas pesquisas de programação em matlab que o bem é para ti.
 
Mas afinal tu queres verificar repetidos ou gerar um sudoku?

Se for para verificar repetidos não é preciso teres tantos ciclos for como ali em cima. basta teres 3 funcoes, uma para verificar os quadrados, outra as linhas e outra as colunas. Para ver se todos os numeros são diferentes usas um array de booleanos em que o indice indica o numero na linha/coluna quadrado - 1. Fazes um ciclo para passar as casas e marcas o array. No fim vez se todas as posições estão true.
 
Back
Topo