Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //http://www.youtube.com/user/thecplusplusguy
- #include <iostream>
- #include <fstream>
- #include <cmath>
- #include <gtk/gtk.h>
- #include <cstdlib>
- #include <cstring>
- using namespace std;
- void initGUI(int*,char***);
- bool sor(int s,int o,int n);
- bool oszlop(int s,int o,int n);
- bool negyzet(int s,int o,int n);
- void solve();
- static int a[9][9];
- static GtkWidget* wid[9][9],*window;
- void open_dialog();
- static void menu_event(GtkWidget*,gpointer);
- struct mypair{
- mypair(int i,int j) : x(i),y(j){};
- int x,y;
- };
- void check_number(GtkWidget* entry,mypair* data);
- int main(int argc,char* argv[])
- {
- for(int i=0;i<9;i++)
- for(int j=0;j<9;j++)
- a[i][j]=0;
- initGUI(&argc,&argv);
- return 0;
- }
- bool sor(int s,int o,int n)
- {
- for(int g=0;g<9;g++)
- {
- if(a[s][g]==n)
- {
- return 0;
- }
- }
- return 1;
- }
- bool oszlop(int s,int o,int n)
- {
- for(int g=0;g<9;g++)
- {
- if(a[g][o]==n)
- return 0;
- }
- return 1;
- }
- bool negyzet(int s,int o,int n)
- {
- int sor=ceil((s+1)/3.);
- int oszlop=ceil((o+1)/3.);
- for(int g=(sor-1)*3;g<((sor-1)*3+3);g++)
- for(int h=(oszlop-1)*3;h<((oszlop-1)*3+3);h++)
- {
- if(a[g][h]==n)
- return 0;
- }
- return 1;
- }
- static void get_elements(GtkWidget* widget,gpointer data)
- {
- for(int i=0;i<9;i++)
- {
- for(int j=0;j<9;j++)
- {
- a[i][j]=atoi(gtk_entry_get_text(GTK_ENTRY(wid[i][j])));
- }
- cout << endl;
- }
- solve();
- }
- void initGUI(int* argc,char*** argv)
- {
- const char* file[] = {"New","Open","Check","Exit"};
- const char* help[] = {"About"};
- gtk_init(argc,argv);
- GtkWidget *vbox,*hbox,*separator,*button,*menu,*file_menu,*help_menu,*menu_bar;
- vbox=gtk_vbox_new(0,0);
- window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
- menu=gtk_menu_new();
- menu_bar=gtk_menu_bar_new();
- file_menu=gtk_menu_item_new_with_label("File");
- help_menu=gtk_menu_item_new_with_label("Help");
- for(int i=0;i<4;i++)
- {
- GtkWidget* menu_item=gtk_menu_item_new_with_label(file[i]);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item);
- g_signal_connect(menu_item,"activate",G_CALLBACK(menu_event),window);
- }
- gtk_menu_item_set_submenu(GTK_MENU_ITEM(file_menu),menu);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar),file_menu);
- menu=gtk_menu_new();
- for(int i=0;i<1;i++)
- {
- GtkWidget* menu_item=gtk_menu_item_new_with_label(help[i]);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item);
- g_signal_connect(menu_item,"activate",G_CALLBACK(menu_event),window);
- }
- gtk_menu_item_set_submenu(GTK_MENU_ITEM(help_menu),menu);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar),help_menu);
- gtk_box_pack_start(GTK_BOX(vbox),menu_bar,0,0,0);
- for(int i=0;i<9;i++)
- {
- hbox=gtk_hbox_new(0,0);
- for(int j=0;j<9;j++)
- {
- wid[i][j]=gtk_entry_new();
- g_signal_connect(wid[i][j],"activate",G_CALLBACK(check_number),NULL);
- // gtk_entry_set_width_chars(GTK_ENTRY(wid[i][j]),1);
- gtk_entry_set_max_length(GTK_ENTRY(wid[i][j]),1);
- gtk_widget_set_size_request(wid[i][j],20,20);
- gtk_box_pack_start(GTK_BOX(hbox),wid[i][j],0,0,0);
- if((j+1)%3==0)
- {
- separator=gtk_vseparator_new();
- gtk_box_pack_start(GTK_BOX(hbox),separator,0,0,0);
- }
- }
- gtk_box_pack_start(GTK_BOX(vbox),hbox,0,0,0);
- if((i+1)%3==0)
- {
- separator=gtk_hseparator_new();
- gtk_box_pack_start(GTK_BOX(vbox),separator,0,0,0);
- }
- }
- button=gtk_button_new_with_label("Solve the sudoku");
- g_signal_connect(button,"clicked",G_CALLBACK(get_elements),NULL);
- gtk_box_pack_start(GTK_BOX(vbox),button,0,0,0);
- g_signal_connect(window,"delete-event",G_CALLBACK(gtk_main_quit),NULL);
- gtk_container_add(GTK_CONTAINER(window),vbox);
- gtk_widget_show_all(window);
- gtk_main();
- }
- void solve()
- {
- int un=0,s,o,tmp;
- bool b=1;
- char c[20];
- for(int i=0;i<9;i++)
- for(int j=0;j<9;j++)
- if(!a[i][j])
- un++;
- while(un && b)
- {
- b=0;
- for(int i=0;i<9;i++)
- {
- for(int j=0;j<9;j++)
- {
- if(a[i][j]!=0)
- continue;
- tmp=0;
- for(int x=1;x<10;x++)
- {
- if(sor(i,j,x) && oszlop(i,j,x) && negyzet(i,j,x))
- {
- if(tmp==0)
- tmp=x;
- else{
- tmp=0;
- break;
- }
- }
- }
- if(tmp!=0)
- {
- a[i][j]=tmp;
- b=1;
- un--;
- }
- }
- }
- }
- if(!b)
- open_dialog();
- else if(!un)
- for(int i=0;i<9;i++)
- {
- for(int j=0;j<9;j++)
- {
- char c[2];
- sprintf(c,"%d",a[i][j]);
- gtk_entry_set_text(GTK_ENTRY(wid[i][j]),c);
- }
- }
- }
- void open_dialog()
- {
- GtkWidget* dialog,*label;
- dialog=gtk_dialog_new_with_buttons("Error",GTK_WINDOW(window),GTK_DIALOG_MODAL,GTK_STOCK_OK,GTK_RESPONSE_OK,NULL);
- label=gtk_label_new("I cannot solve the sudoku.\nYou may entered wrong numbers or the sudoku has no solution.\nIt is a passibility, that this sudoku has more possible solution, in case like that\nthis program will not work.");
- gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),label,0,0,0);
- gtk_widget_show_all(dialog);
- gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy(dialog);
- }
- void check_number(GtkWidget* entry,mypair* data)
- {
- const gchar* c=gtk_entry_get_text(GTK_ENTRY(entry));
- if(!isdigit(c[0]))
- {
- GtkWidget* dialog,*label;
- dialog=gtk_dialog_new_with_buttons("Error",GTK_WINDOW(window),GTK_DIALOG_MODAL,GTK_STOCK_OK,GTK_RESPONSE_OK,NULL);
- label=gtk_label_new("This is not a number!");
- gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),label,0,0,0);
- gtk_widget_show_all(dialog);
- gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy(dialog);
- }
- }
- bool bad_number(int i)
- {
- if(!(i>=0 && i<10))
- {
- GtkWidget* dialog,*label;
- dialog=gtk_dialog_new_with_buttons("Error",GTK_WINDOW(window),GTK_DIALOG_MODAL,GTK_STOCK_OK,GTK_RESPONSE_OK,NULL);
- label=gtk_label_new("This number is bigger than 9 or less than 0\nOr maybe not event a number");
- gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),label,0,0,0);
- gtk_widget_show_all(dialog);
- gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy(dialog);
- return 1;
- }
- return 0;
- }
- static void menu_event(GtkWidget* menu_item,gpointer data)
- {
- if(strcmp(gtk_menu_item_get_label(GTK_MENU_ITEM(menu_item)),"New")==0)
- {
- for(int i=0;i<9;i++)
- for(int j=0;j<9;j++)
- {
- a[i][j]=0;
- gtk_entry_set_text(GTK_ENTRY(wid[i][j]),"0");
- }
- }else if(strcmp(gtk_menu_item_get_label(GTK_MENU_ITEM(menu_item)),"Open")==0)
- {
- GtkWidget *dialog;
- dialog=gtk_file_chooser_dialog_new("Choose the sudoku file",GTK_WINDOW(data),GTK_FILE_CHOOSER_ACTION_OPEN,GTK_STOCK_OK,GTK_RESPONSE_OK,
- GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,NULL);
- gtk_widget_show_all(dialog);
- gint resp=gtk_dialog_run(GTK_DIALOG(dialog));
- if(resp==GTK_RESPONSE_OK)
- {
- ifstream in(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)));
- for(int i=0;i<9;i++)
- {
- for(int j=0;j<9;j++)
- {
- if(in.eof())
- break;
- in >> a[i][j];
- if(bad_number(a[i][j]))
- break;
- char c[2];
- sprintf(c,"%d",a[i][j]);
- gtk_entry_set_text(GTK_ENTRY(wid[i][j]),c);
- }
- }
- in.close();
- }
- gtk_widget_destroy(dialog);
- solve();
- }else if(strcmp(gtk_menu_item_get_label(GTK_MENU_ITEM(menu_item)),"Check")==0)
- {
- bool b=0;
- for(int i=0;i<9;i++)
- for(int j=0;j<9;j++)
- if(!(a[i][j]>=0 && a[i][j]<10 && sor(i,j,a[i][j]) && oszlop(i,j,a[i][j]) && negyzet(i,j,a[i][j])))
- b=1;
- if(b)
- {
- GtkWidget* dialog,*label;
- dialog=gtk_dialog_new_with_buttons("Error",GTK_WINDOW(window),GTK_DIALOG_MODAL,GTK_STOCK_OK,GTK_RESPONSE_OK,NULL);
- label=gtk_label_new("The sudoku is not good.\nThere is the same numer in a row\ncoloumn or square or it's not a number");
- gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),label,0,0,0);
- gtk_widget_show_all(dialog);
- gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy(dialog);
- }
- }else if(strcmp(gtk_menu_item_get_label(GTK_MENU_ITEM(menu_item)),"Exit")==0)
- {
- gtk_main_quit();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement