Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Perdomo

[Resolvido] Matriz randomica Sudoku

Recommended Posts

Pessoal,

 

to com a seguinte dificuldade. Fiz o jogo sudoku para um trabalho da faculdade, so que usei uma matriz estatica, porem preciso fazer uma matriz randomica. Ao total tenho que colocar 27 numeros distribuidos entre os 3 quadrantes, respeitando a regra do jogo (o numero so pode estar uma vez na mesma linha, mesma coluna, mesmo quadrante.

 

Alguem pode me ajudar?

 

Abaixo o meu codigo

 

#include<stdio.h>
#include<stdlib.h>
#define N 9

int op, numero ,linha, coluna;



int grade1[N][N] =
  {{ 0, 6, 0, 1, 0, 4, 0, 5,  0},
   { 0, 0, 8, 3, 0, 5, 6, 0, 0},
   { 2, 0, 0, 0, 0, 0, 0, 0, 1},
   { 8, 0, 0, 4, 0, 7, 0, 0, 6},
   { 0, 0, 6, 0, 0, 0, 3, 0, 0},
   { 7, 0, 0, 9, 0, 1, 0, 0, 4},
   { 5, 0, 0, 0, 0, 0, 0, 0, 2},
   { 0, 0, 7, 2, 0, 6, 9, 0, 0},
   { 0, 4, 0, 5, 0, 8, 0, 7, 0}};


void desenha_grade() {
  int i,j;
  printf("  1  2  3   4  5  6   7  8  9  \n");
  printf("+---------+---------+---------+\n");
  for (i = 0; i < N; i++) {
	printf("|");
	for (j = 0; j < N; j++) {
	  if (grade1[i][j] != 0)
	printf(" %d ", grade1[i][j]);
	  else
	printf("   ");
	  if (j % 3 == 2) 
	printf("|");
	}
	if (i % 3 == 2)
	  printf("\n+---------+---------+---------+");
	printf("\n");
  }
}

int checar(int linha, int coluna, int numero) {
	 if (grade1[linha][coluna]==0)
		 return 1;
	 else
		 return 0;	
}

int tenta_colocar(int i, int j, int k) {
  int c,l;
  for (l = 0; l < N; l++)
	if (grade1[l][j] == k)
	  return 0;
  for (c = 0; c < N; c++)
	if (grade1[i][c] == k)
	  return 0;
  for (l = i - i % 3; l < i - i % 3 +3; l++)
	for (c = j - j % 3; c < j - j % 3 + 3; c++)
	  if (grade1[l][c] == k)
	return 0;
  grade1[i][j] = k;
  desenha_grade();
  return 1;
}


int coordenadavalida(int linha, int coluna) 
{
  if(linha>=0 && linha <9 && coluna>=0 && coluna <9)
	  return 1;
   else
	  return 0;
}


int numerovalido(int numero)
{
  if(numero>0 && numero <=9)
	 return 1;
   else
	  return 0;

}


int existenaColuna(int coluna, int numero)
 {
					   
	  for (int i=0; i<9; i++)
	   {
		  if (grade1[i][coluna] == numero)
			  return 1;
	   }
}


int existenalinha(int linha, int numero) 
{
	   for (int j=0; j<9; j++)
	   {
		   if (grade1[linha][j] == numero)
			   return 1;
		}
}

void escreve(int linha, int coluna, int numero) {
	 grade1[linha][coluna]=numero;
}


void jogo()
{
	printf("digite 0(ZERO) para sair");
	if (coordenadavalida(linha-1, coluna-1)==1)
	{
	   printf("Coordenada Valida\n");
	   if (numerovalido(numero)==1)
	   {
		  printf("Numero valido\n");
		  if (checar(linha-1, coluna-1, numero)==1)
		  {
			  printf("Posicao vazia\n");
			  if (tenta_colocar(linha-1, coluna-1, numero)==1)
			  {
				  printf("Quadrante OK\n");
					escreve(linha-1,coluna-1,numero);
					 printf("Gravado\n");
					 system("cls");
				  
			   }   
			   else
			   {
				   printf("Nao foi possivel, ja existe na linha ou na coluna ou no mesmo quadrante\n");
			   }
		   }	
		   else
		   {
			   printf("Posicao ja esta ocupada\n");
		   }
		}   
		else
		{
			printf("Numero invalido\n");
		}	
	}
	else
	{
		printf("Coordenada invalida\n");
	}		  
}

int terminar()
{
	for (int i=0;i<9;i++)
		for (int j=0;j<9;j++)
		   if (grade1[i][j]==0) 
			 return 1;
}


void geratela()
{

   desenha_grade(); 
   
   printf("Digite uma linha: ");
   scanf("%d", &linha);
 
   printf("Digite uma coluna: ");
   scanf("%d", &coluna);
   
   printf("Digite o numero: ");
   scanf("%d", &numero);  
   
   jogo();
}


int main() {

printf("LUSOKU\n\n\n");


branco();

printf("REGRAS DO JOGO\n");
printf("O objetivo do jogo e completar todos os quadrados utilizando\n");
printf("numeros de 1 a 9. Para completa-los, seguiremos a seguinte regra: \n"); 
printf("Nao podem haver numeros repetidos nas linhas horizontais e verticais, \n");
printf("assim como nos quadrados grandes.\n\n\n");

			  
   while(terminar()!=0)
	 {   
		 geratela(); 
		 terminar();				  
	 }   
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Leia sobre srand,rand e random.

 

Cara,

 

obrigado pela ajuda, ja sabia que eu tinha que usar o random mas nao sabia como, aí li a explicacao no CBRASIL, deusulivre!! alumiou as ideia!!

 

Valeu!

 

[]´s

Igor Perdomo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Leia sobre srand,rand e random.

 

Cara,

 

obrigado pela ajuda, ja sabia que eu tinha que usar o random mas nao sabia como, aí li a explicacao no CBRASIL, deusulivre!! alumiou as ideia!!

 

Valeu!

 

[]´s

Igor Perdomo

 

 

Tche,

 

minhas ideias nao se alumiaram tanto assim, consegui gerar a matriz mas nao consigo fazer com que ela respeite a regra do sudoku(linha, coluna e quadrante). Podem me ajudar.

 

 

 

void desenha_grade() {
  int i,j;
  printf("  1  2  3   4  5  6   7  8  9  \n");
  printf("+---------+---------+---------+\n");
  srand(10);
  for (i = 0; i < N; i++) {
	printf("|");
	for (j = 0; j < N; j++) {
		if (grade1[i][j] != 0)
	printf(" %d ", grade1[i][j], "%d" ,rand()%9);
	  else
	printf("   ");
		if (j % 3 == 2) 
	printf("|");
	}
	if (i % 3 == 2)
	  printf("\n+---------+---------+---------+");
	printf("\n");
  }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Leia sobre srand,rand e random.

 

Cara,

 

obrigado pela ajuda, ja sabia que eu tinha que usar o random mas nao sabia como, aí li a explicacao no CBRASIL, deusulivre!! alumiou as ideia!!

 

Valeu!

 

[]´s

Igor Perdomo

 

 

Tche,

 

primeiro, desculpa pelo cara, nao li direito o teu nome:P.

 

 

minhas ideias nao se alumiaram tanto assim, consegui gerar a matriz randomica mas nao consigo fazer com que ela respeite a regra do sudoku(linha, coluna e quadrante). Podem me ajudar.

 

 

 

void desenha_grade() {
  int i,j;
  printf("  1  2  3   4  5  6   7  8  9  \n");
  printf("+---------+---------+---------+\n");
  srand(10);
  for (i = 0; i < N; i++) {
	printf("|");
	for (j = 0; j < N; j++) {
		if (grade1[i][j] != 0)
	printf(" %d ", grade1[i][j], "%d" ,rand()%9);
	  else
	printf("   ");
		if (j % 3 == 2) 
	printf("|");
	}
	if (i % 3 == 2)
	  printf("\n+---------+---------+---------+");
	printf("\n");
  }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

você tem submatrizes no negocio...cada uma é 3x3.

quando você gera um numero de 1 a 9,você tem que percorrer a linha e a coluna inteiras pra ver se ja existe.Se nao existir,entao coloque o numero la. Pra delimitar onde você pode colocar o numero:

 

matriz grande: indices i e j.

submatrizes: inicio e final sao multiplos de 3.

 

se você tem N submatrizes, entao você tem um for de 1 a N pra conferir em todas. No meio de tudo existem loops com inicio e termino em multiplos de 3.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.