Pascal/Turbo Pascal - PROBLEMAS CON MATRIZ

 
Vista:

PROBLEMAS CON MATRIZ

Publicado por martín (74 intervenciones) el 16/02/2010 14:13:20
Hola:
Inserto el código fuente de una matriz que no debe repetir los numeros (0 al 9) ni en las lineas verticales ni en la horizontales. Como podeis ver, las 5 últimas sentencias de REPETICION están desactivadas, pues de estar todas activadas no se produce la matriz o rara vez se produce, y ese es my problema, desdeluego, no faltaba mas. Agradezco infinitamente la ayuda que me puedan prestar:


program Sin_repeticion_en_vectores;
uses crt;
type
digitos = set of 0..9;
var

t : array[1..9,1..9] of integer;
x,y,i,j,n,p,q,gd,gm : integer;
a,b,c,d,e,f,g,h,k,l : digitos;

begin

randomize;
a := [];
b := [];
c := [];
d := [];
e := [];
f := [];
g := [];
h := [];
k := [];
l := [];

for y := 1 to 9 do
begin

repeat
t[1,y] := random(10);
n := t[1,y]
until ((n in h)=false) and ((n in a)=false);
include(h,n); include(a,n);

repeat
t[2,y] := random(10);
n := t[2,y]
until ((n in h)=false) and ((n in b)=false);
include(h,n); include(b,n);

repeat
t[3,y] := random(10);
n := t[3,y]
until ((n in h)=false) and ((n in c)=false);
include(h,n); include(c,n);

repeat
t[4,y] := random(10);
n := t[4,y]
until ((n in h) = false) and ((n in d) = false);
include(h,n); include(d,n);

{repeat
t[5,y] := random(10);
n := t[5,y]
until ((n in h) = false) and ((n in e) = false);
include(h,n); include(e,n);

repeat
t[6,y] := random(10);
n := t[6,y]
until ((n in h) = false) and ((n in f) = false);
include(h,n); include(f,n);

repeat
t[7,y] := random(10);
n := t[7,y]
until ((n in h) = false) and ((n in g) = false);
include(h,n); include(g,n);

repeat
t[8,y] := random(10);
n := t[8,y]
until ((n in h) = false) and ((n in k) = false);
include(h,n); include(k,n);

repeat
t[9,y] := random(10);
n := t[9,y]
until ((n in h) = false) and ((n in l) = false);
include(l,n);}
h := []
end;

j := 6;
for y := 1 to 9 do
begin
i := 8;
for x := 1 to 9 do
begin
gotoxy(i,j);
write(t[x,y]);
i := i+3
end;
j := j+2
end;
readln;

end.

Un saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:PROBLEMAS CON MATRIZ

Publicado por Diego Romero (996 intervenciones) el 16/02/2010 19:25:43
A ver si entendí bien?:

type

TMatriz=Array[1..9,1..9] of integer;

var
Matriz: TMatriz;
Num, I, J: integer;

procedure MostrarMatriz(M: TMatriz);
var
I, J: integer;
begin
for i:=1 to 9 do
begin
for j:=1 to 9 do
Write(M[i,j]:2);
WriteLn;
end; { for i }
end;

begin

Num:=1;

for i:=1 to 9 do
begin

for j:=1 to 9 do
begin
Matriz[I, J]:=Num;
Num:=Num+1;
if Num > 9 then
Num:=1;
end; { for j }

Num:=Matriz[I, 1]+1;
end; { for i }

MostrarMatriz(Matriz);
ReadLn;
end.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:PROBLEMAS CON MATRIZ

Publicado por martín (74 intervenciones) el 16/02/2010 20:02:32
Hola, Diego.
Ante todo muy agradecido por tu colaboración, pero no es exactamente lo que pido, pues te habrás dado cuenta que, en mi programa, cada número lo produce un random, puesto que lo que quiero es que no se repitan los numeros en las filas y tampoco en las columnas y a su vez de forma aleatoria. como si fuera un sudoku pero sin espacios en blanco.
Lo dicho, muy agradecido y un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:PROBLEMAS CON MATRIZ

Publicado por Diego Romero (996 intervenciones) el 17/02/2010 08:57:11
Pues debido a que tienes nueve posiciones en cada fila y cada columna y no debe haber repetidos y tienes del 1 al 9 para llenar cada fila o cada columna, necesariamente debes prescindir de random() para generar los valores de cada posición, porque random() no te asegura que no se generará el mismo número más de una vez para la misma fila (o columna).

Entonces partiendo de mi programa, lo que puedes hacer es intercambiar aleatoriamente posiciones en una fila ya que mi programa te asegura que no habrá repetidos al menos en la misma fila (o columna, como prefieras).

Luego puedes hacer un procedimiento que verifique que no haya repetidos en la misma columna, cada vez que haya un repetido, intercambia ese valor por otro aleatorio en la misma *fila* (así desaparecería de la columna). Este procedimiento repítelo hasta que no haya más intercambios, ya que si no hubo intercambio alguno en ninguna parte significa que no hay repetidos en ninguna columna.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar