<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="http://forum.ubuntu-fr.org/extern.php?action=feed&amp;tid=21539&amp;type=rss" rel="self" type="application/rss+xml" />
		<title><![CDATA[Forum Ubuntu-fr.org / sudoku solver]]></title>
		<link>http://forum.ubuntu-fr.org/viewtopic.php?id=21539</link>
		<description><![CDATA[Les sujets les plus récents dans sudoku solver.]]></description>
		<lastBuildDate>Sun, 08 Jan 2006 16:13:52 +0000</lastBuildDate>
		<generator>FluxBB</generator>
		<item>
			<title><![CDATA[Réponse à&#160;:  sudoku solver]]></title>
			<link>http://forum.ubuntu-fr.org/viewtopic.php?pid=165135#p165135</link>
			<description><![CDATA[<p>Au sujet de l&#039;installation de KSudoku, je conseille la méthode suivante:<br />- télécharger ksudoku-0.3-1.i386.rpm sur http://sourceforge.net/projects/ksudoku/<br />- sudo alien -d ksudoku-0.3-1.i386.rpm<br />- sudo dpkg -i ksudoku_0.3-2_i386.deb</p>]]></description>
			<author><![CDATA[dummy@example.com (Eric P.)]]></author>
			<pubDate>Sun, 08 Jan 2006 16:13:52 +0000</pubDate>
			<guid>http://forum.ubuntu-fr.org/viewtopic.php?pid=165135#p165135</guid>
		</item>
		<item>
			<title><![CDATA[Réponse à&#160;:  sudoku solver]]></title>
			<link>http://forum.ubuntu-fr.org/viewtopic.php?pid=150486#p150486</link>
			<description><![CDATA[<div class="quotebox"><cite>HoPHP a écrit&#160;:</cite><blockquote><div><p>Défi (juste le temps que je t&#039;en trouve un autre...): Coder la fonction &quot;Plus petit dénominateur commun&quot; en deux lignes de code.</p></div></blockquote></div><p>Pour du c++, le travail est également déja fait<br /><a href="http://www.boost.org/libs/math/doc/common_factor.html#gcd_obj">http://www.boost.org/libs/math/doc/comm … ml#gcd_obj</a></p>]]></description>
			<author><![CDATA[dummy@example.com (m+rh-e)]]></author>
			<pubDate>Mon, 19 Dec 2005 17:37:18 +0000</pubDate>
			<guid>http://forum.ubuntu-fr.org/viewtopic.php?pid=150486#p150486</guid>
		</item>
		<item>
			<title><![CDATA[Réponse à&#160;:  sudoku solver]]></title>
			<link>http://forum.ubuntu-fr.org/viewtopic.php?pid=150297#p150297</link>
			<description><![CDATA[<p>Défi (juste le temps que je t&#039;en trouve un autre...): Coder la fonction &quot;Plus petit dénominateur commun&quot; en deux lignes de code.</p><p>Sinon, les projets dans lesquels tu pourrais te lancer pour le bien de l&#039;humanité (je te laisse le soin des recherches...).</p><p>GNU/Hurd<br />Encodeur Ogg Vorbis en arithmétique entière<br />kernel GNU/Linux</p><p>Bref, le choix est vaste <img src="http://forum.ubuntu-fr.org/img/smilies/big_smile.png" width="15" height="15" alt="big_smile" /></p>]]></description>
			<author><![CDATA[dummy@example.com (HoPHP)]]></author>
			<pubDate>Mon, 19 Dec 2005 13:32:46 +0000</pubDate>
			<guid>http://forum.ubuntu-fr.org/viewtopic.php?pid=150297#p150297</guid>
		</item>
		<item>
			<title><![CDATA[Réponse à&#160;:  sudoku solver]]></title>
			<link>http://forum.ubuntu-fr.org/viewtopic.php?pid=148962#p148962</link>
			<description><![CDATA[<p>:-) </p><p>nop, t&#039;inquiète, pour moi, l&#039;interet était juste intellectuel, le fait que ca existe deja, meme en mieux, ne m&#039;interesse pas, juste le fait que je suis capable de le faire... je voulais juste en faire profiter.<br />Cela dit, si ca existe en mieux autre part, tant mieux pour tout le monde, mon mesage ne sert alors a rien :-D</p><p>PS: si il y a d&#039;autres codeurs fous fans de defis algorithmiques... je suis preneur</p>]]></description>
			<author><![CDATA[dummy@example.com (maloq)]]></author>
			<pubDate>Sat, 17 Dec 2005 03:54:39 +0000</pubDate>
			<guid>http://forum.ubuntu-fr.org/viewtopic.php?pid=148962#p148962</guid>
		</item>
		<item>
			<title><![CDATA[Réponse à&#160;:  sudoku solver]]></title>
			<link>http://forum.ubuntu-fr.org/viewtopic.php?pid=148818#p148818</link>
			<description><![CDATA[<p>Salut, </p><p>tout d&#039;abord bravo pour ton script que je n&#039;ai pas essayé (oui, honte sur moi...). Cela a certainement dû être très intéressant à faire.</p><p>Je savais qu&#039;il existait déjà des scripts pas mal et j&#039;ai retrouvé celui auquel je pensais, il faut que tu le testes:</p><p><a href="http://ksudoku.sourceforge.net">Ksudoku</a> ! (L&#039;installation par paquets pose quelques problèmes... mais tu as l&#039;air de maîtriser la compilation ...)</p><p>Il permet plusieurs choses:</p><p>* Création selon plusieurs paramètres<br /><span class="postimg"><img src="http://sourceforge.net/dbimage.php?id=42663" alt="dbimage.php?id=42663" /></span><br />* Sudoku en 3 dimensions<br /><span class="postimg"><img src="http://sourceforge.net/dbimage.php?id=42661" alt="dbimage.php?id=42661" /></span><br />* Résolution<br />* Introduction de Sudokus personnalisés (pour les résoudre)<br />etc...</p><p>Bref. Tout ça pour dire que ce que tu as fait, c&#039;est très bien, tu t&#039;es sûrement défoulé (ceci n&#039;a pas de connotation négative!) à faire ton script, mais en fait, ça existe déjà, en &quot;mieux&quot;. Bref, dommage...</p><p>@+, HoPHP</p><p>P.S. J&#039;ai peur de ne pas me faire comprendre: c&#039;est cool ce que tu as fait, mais ça existe malheureusement déjà.</p>]]></description>
			<author><![CDATA[dummy@example.com (HoPHP)]]></author>
			<pubDate>Fri, 16 Dec 2005 20:37:53 +0000</pubDate>
			<guid>http://forum.ubuntu-fr.org/viewtopic.php?pid=148818#p148818</guid>
		</item>
		<item>
			<title><![CDATA[Réponse à&#160;:  sudoku solver]]></title>
			<link>http://forum.ubuntu-fr.org/viewtopic.php?pid=148791#p148791</link>
			<description><![CDATA[<p>ca roule (faut compiler avec pkg-config gtk+-2.0 gthread-2.0)</p><div class="codebox"><pre class="vscroll"><code>#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;gtk/gtk.h&gt;
#include &lt;string.h&gt;

typedef struct _data * pdata;
typedef struct _data
{
  gboolean fin;

  char table[9][9];

  GtkWidget *cases[9][9];
  guint timeout_id;

}Data;


gboolean resoudre(GtkWidget *bouton, GtkWidget *cases[9][9]);
gint popup_message(gchar *message);
gpointer brute_force(gpointer data_);
gboolean fonction_timeout(gpointer data_);
char *itos(char n);
gboolean table_possible(gchar table[9][9],gint ligne, gint colonne);
gboolean recur(gchar table[9][9], gpointer visible);
gboolean charger_fichier(char *nom,GtkWidget *cases[9][9]);

int main (int argc, char **argv)
{
  GtkWidget *fenetre_principale;
  GtkWidget *table;
  GtkWidget *cases[9][9];
  GtkWidget *v_box;
  GtkWidget *bouton_exec;

  gint l,c;

  if (!g_thread_supported ()) g_thread_init (NULL);
  gtk_init(&amp;argc,&amp;argv);

  //la fenetre principale
  fenetre_principale=gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(fenetre_principale),&quot;EasySudoku&quot;);
  gtk_window_set_resizable(GTK_WINDOW(fenetre_principale),FALSE);
  gtk_window_set_position(GTK_WINDOW(fenetre_principale),GTK_WIN_POS_MOUSE);

  //la tabble et les entries
  table=gtk_table_new(9,9,TRUE);
  for(l=0;l!=9;l++)
    for(c=0;c!=9;c++)
      {
	cases[l][c]=gtk_entry_new();
	gtk_widget_set_usize(cases[l][c],20,20);
	gtk_entry_set_max_length(GTK_ENTRY(cases[l][c]),1);
	gtk_table_attach_defaults(GTK_TABLE(table),cases[l][c],l,l+1,c,c+1);
      }

  //le bouton execute
  bouton_exec=gtk_button_new_with_label(&quot; Resoudre! &quot;);

  //la boite verticale
  v_box=gtk_vbox_new(FALSE,3);
  
  //  on remplie la boite
  gtk_box_pack_start(GTK_BOX(v_box),table,TRUE,FALSE,3);
  gtk_box_pack_start(GTK_BOX(v_box),bouton_exec,FALSE,FALSE,3);
  gtk_container_add(GTK_CONTAINER(fenetre_principale),v_box);

  //connection aux signaux
  gtk_signal_connect(GTK_OBJECT(fenetre_principale),&quot;delete_event&quot;,GTK_SIGNAL_FUNC(gtk_main_quit),NULL);
  gtk_signal_connect(GTK_OBJECT(fenetre_principale),&quot;destroy_event&quot;,GTK_SIGNAL_FUNC(gtk_main_quit),NULL);
  gtk_signal_connect(GTK_OBJECT(bouton_exec),&quot;clicked&quot;,GTK_SIGNAL_FUNC(resoudre),cases);


  if(argc==2)
    charger_fichier(argv[1],cases);

  gtk_widget_show_all(fenetre_principale);
  gtk_main();

  return 0;
}



gboolean charger_fichier(char *nom,GtkWidget *cases[9][9])
{
  FILE *fp;
  char tab[81];
  gint l,c,i;
  char texte[2];
  texte[1]=&#039;\0&#039;;

  if((fp=fopen(nom,&quot;rb&quot;))==NULL)
    {
      g_warning(&quot;Impossible d&#039;ouvrir le fichier en lecture\n&quot;);
      return FALSE;
    }

  fread(tab,1,81,fp);

  for(i=0,l=0;l!=9;l++)
    for(c=0;c!=9;c++)
      {
	texte[0]=tab[i];
	gtk_entry_set_text(GTK_ENTRY(cases[c][l]),texte);
	i++;
      }

  fclose(fp);
  return TRUE;
}

  

char *itos(char n)
{
  char *retour;
  
  switch (n)
    {
    case 0: retour=&quot;&quot;; break;
    case 1: retour=&quot;1&quot;; break;
    case 2: retour=&quot;2&quot;; break;
    case 3: retour=&quot;3&quot;; break;
    case 4: retour=&quot;4&quot;; break;
    case 5: retour=&quot;5&quot;; break;
    case 6: retour=&quot;6&quot;; break;
    case 7: retour=&quot;7&quot;; break;
    case 8: retour=&quot;8&quot;; break;
    case 9: retour=&quot;9&quot;; break;
    default: retour=&quot;&quot;; break;
    }

  return retour;
}

gint popup_message(char *message)
{
  GtkWidget *dialog = gtk_message_dialog_new (NULL,
					      GTK_DIALOG_DESTROY_WITH_PARENT,
					      GTK_MESSAGE_INFO,
					      GTK_BUTTONS_CLOSE,
					      &quot;%s&quot;,
					      message);
  gtk_dialog_run (GTK_DIALOG (dialog));
  gtk_widget_destroy (dialog);
  
  return 0;
}

gboolean resoudre(GtkWidget *bouton, GtkWidget *cases[9][9])
{
  gint l,c;
  gboolean error=FALSE;
  pdata data = (pdata)g_malloc(sizeof(Data));

  data-&gt;fin=FALSE;
  
  for(l=0;l!=9;l++)
    {
      for(c=0;c!=9;c++)
	{
	  data-&gt;cases[l][c]=cases[l][c];
	  data-&gt;table[l][c]=(char)atoi(gtk_entry_get_text(GTK_ENTRY(cases[l][c])));
	  if(data-&gt;table[l][c]&lt;0 || data-&gt;table[l][c]&gt;9)
	    {
	      error=TRUE;
	      break;
	    }
	}
      if(error==TRUE) break;
    }
  if(error==TRUE) 
    popup_message(&quot;Les champs doivent contenir un chiffre entre 1 et 9, ou etre laisses vides&quot;);
  else
    g_thread_create(brute_force,data,FALSE,NULL);

  data-&gt;timeout_id=gtk_timeout_add(200,fonction_timeout,data);
    
  return FALSE;
}

gboolean fonction_timeout(gpointer data_)
{
  pdata data=(pdata)data_;
  int l,c;
  char *texte;

  for(l=0;l!=9;l++)
    for(c=0;c!=9;c++)
      {
	texte=itos(data-&gt;table[l][c]);
	gtk_entry_set_text(GTK_ENTRY(data-&gt;cases[l][c]),texte);
      }

  if(data-&gt;fin==TRUE)
    {
      popup_message(&quot;ok!&quot;);
      return FALSE;
    }
  
  return TRUE;
}



gboolean table_possible(gchar table[9][9],gint ligne, gint colonne)
{
  gint l,c,l2,c2;
  gchar base=table[ligne][colonne];

  table[ligne][colonne]=0;

  //on verifie la grande ligne
  for(l=0;l!=9;l++)
    if(table[l][colonne]==base) return FALSE;

  //la colonne
  for(c=0;c!=9;c++)
    if(table[ligne][c]==base) return FALSE;

  //et enfin la minicase (on se place en haut a droite de la minicase)
  l=ligne-ligne%3;
  c=colonne-colonne%3;
  
  for(l2=l;l2!=l+3;l2++)  
    for(c2=c;c2!=c+3;c2++)
      if(table[l2][c2]==base) return FALSE;

  table[ligne][colonne]=base;

  return TRUE;
}


gboolean recur(gchar table[9][9], gpointer visible)
{
  gchar table_prim[9][9];
  gchar *pt=(gchar *)table;
  gint l,c,cpt;

  memcpy(table_prim,table,81);  //duplique la table
  memcpy(visible,table,81);     //on la recopie pour l&#039;affichage

  //premiere case vide
  for(cpt=0;cpt!=81;cpt++)
    if(pt[cpt]==0) break;

  //tout est rempli on retourne succes (TRUE)
  if(cpt==81) return TRUE;

  //quelle case vide?
  c=cpt%9;
  l=(cpt-c)/9;
  
  //on lui met des valeurs
  for(cpt=1;cpt!=10;cpt++)
    {
      table_prim[l][c]=cpt;
      if(table_possible(table_prim,l,c)==TRUE)
	if(recur(table_prim,visible)==TRUE)
	  return TRUE;
    }

  return FALSE;
}

    

gpointer brute_force(gpointer data_)
{
  pdata data=(pdata)data_;
  gchar table[9][9];

  memcpy(table,data-&gt;table,81);
  recur(table,data-&gt;table);
  data-&gt;fin=TRUE;
  
  return NULL;
}</code></pre></div>]]></description>
			<author><![CDATA[dummy@example.com (maloq)]]></author>
			<pubDate>Fri, 16 Dec 2005 19:37:06 +0000</pubDate>
			<guid>http://forum.ubuntu-fr.org/viewtopic.php?pid=148791#p148791</guid>
		</item>
		<item>
			<title><![CDATA[Réponse à&#160;:  sudoku solver]]></title>
			<link>http://forum.ubuntu-fr.org/viewtopic.php?pid=148789#p148789</link>
			<description><![CDATA[<p>Ben tu peux le mettre entre les balises code ici ou sur une page du wiki...</p>]]></description>
			<author><![CDATA[dummy@example.com (thom)]]></author>
			<pubDate>Fri, 16 Dec 2005 19:34:36 +0000</pubDate>
			<guid>http://forum.ubuntu-fr.org/viewtopic.php?pid=148789#p148789</guid>
		</item>
		<item>
			<title><![CDATA[sudoku solver]]></title>
			<link>http://forum.ubuntu-fr.org/viewtopic.php?pid=148787#p148787</link>
			<description><![CDATA[<p>bonjour,</p><p>Aujourdhui, à mon cours de droit du travail, je séchais lamentablement sur le petit jeu Sudoku (petit jeu japonais de logique assez rigolo). Celui que j&#039;avais devant les yeux était particulièrement velu, et au bout de 3h d&#039;énervement, je décide, non pas d&#039;abandonner, mais de me lancer dans un algo de résolution de ce satané b**** de m**** de jeu.</p><p>Ainsi, après 3h d&#039;Xemacs, je suis enfin venu a bout de n&#039;importe quel Sudoku du monde... gnarf!!!! on me la fait pas à moi.</p><p>Je me demandais juste: comment faire pour partager ce petit logiciel avec ceux que ce jeu éxaspère aussi? (si ca interesse quelqu&#039;un...)</p>]]></description>
			<author><![CDATA[dummy@example.com (maloq)]]></author>
			<pubDate>Fri, 16 Dec 2005 19:30:21 +0000</pubDate>
			<guid>http://forum.ubuntu-fr.org/viewtopic.php?pid=148787#p148787</guid>
		</item>
	</channel>
</rss>
