Премини към съдържанието

boy1

Потребител
  • Публикации

    17
  • Регистрация

  • Последно онлайн

Харесвания

3 Неутрална репутация

Всичко за boy1

  • Титла
    Потребител
  1. boy1

    Програма за ришаване на Судоку 9x9

    Цяла нощ търсих и най-накрая успях да намеря решение в Интернет. Сега всичко си работи. Само едно нещо не успях да схвана и ако може да Ви помоля да ми го обясните(ако имате желание разбира се). Ако не се намери число в интервала 1-9 програмата не трябва ли да приключи? Как се осъществява връщането назад? Ето и кода: П.С. В main() имам само Game.Help_Solve(1, 1) и функцията за извеждане. bool Sudoku::Help_Solve(int i, int j) { int nextrow, nextcol; while(change[i][j] == 1) //намираме първата клетка, { //която позволява на числото в нея да се изменя j++; if(j > 9) { j = 1; i++; } if(i > 9) return true; } for(int p = 1; p <= 9; p++) { if(Game.Check_Conflicts(p, i, j)) //Проверяваме за конфликти { board[i][j] = p; nextrow = i; nextcol = j+1; if(nextcol > 9) { nextcol = 1; nextrow++; } if(nextcol == 1 && nextrow == 10) return true; if(Game.Help_Solve(nextrow, nextcol)) return true; } } board[i][j] = 0; return false; }
  2. boy1

    Програма за ришаване на Судоку 9x9

    Днес размишлявах още над алгоритъма и намерих грешка в една от проверките за това дали числото се среща в малкото си квадратче 3х3. Но намяше кой знае какъв ефект. Също установих, че дори да няма предварително зададени стойности, тоест в началото дъската да е напълно празна, пак накрая доста от квадратчета са със стойност 0. Също премахнах board[j] = 0 от последния ред на Help_Solve(...) и броя на нулевите стойности намаля. А на доста места където има стойности по-големи от нула числата не са вярни (само на 6-7 места е както трябва). Значи грешката ще е някъде във Help_Solve(...). Само че не мога да разбера къде точно... Оправих грешката с проверката в първия си пост.
  3. boy1

    Програма за ришаване на Судоку 9x9

    Е не видяхте ли, че съм се поправил после. Какво да правя... В бързината просто съм натиснал съседния бутон....
  4. Понеже предишната тема, която пуснах беше заключена поради неясно заглавие, се надявам, че сега всичко ще е наред. П.С. Е сега пък съм допуснал правописна грешка в заглавието.... Реших да направя програмка, която решава судоку, но нещо не се справям добре. Потърсих в Гугъл информация какъв алгоритъм мога да използвам и на много места срещнах идеята за рекурсия: Опитах се да го съставя, но нещо кода ми куца. От всичките 81 места на таблото само 6-7 места ми се запълват с вярни стойности (ако не броим предварително зададените). Може би нещо самата рекурсия не е наред. Използвам за тестване ето това судоку: http://bg.wikipedia.org/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Sudoku-by-L2G-20050714.gif Та въпросът ми е дали виждате някаква видима грешка, защото от няколко дни се мъча и не се получава. Ето и кода. Малко е дълъг, но се надявам да не Ви затрудни, защото не е много сложен. #include <iostream> #include <iomanip> #include <time.h> #include <cstdlib> #include <windows.h> using namespace std; class Sudoku { private: int board[9][9]; int change[9][9]; public: Sudoku(); void Print_Board(); void Add_First_Cord(); void Solve(); void Help_Solve(int i, int j); bool Check_Conflicts(int p, int i, int j); }; Sudoku Game; void setcolor(unsigned short color) //The function that you'll use to { //set the colour HANDLE hcon = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hcon,color); } Sudoku::Sudoku() { for(int i = 0; i <= 9; i++) for(int j = 0; j <= 9; j++) board[i][j] = 0; } void Sudoku::Print_Board() { for(int i = 1; i <= 9; i++) { for(int j = 1; j <= 9; j++) { if(change[i][j] == 1) { setcolor(12); cout << board[i][j] << " "; setcolor(7); } else cout << board[i][j] << " "; if(j%3 == 0) cout << "| "; } cout << endl; if(i%3 == 0) cout << "------+-------+--------" << endl; } } void Sudoku::Add_First_Cord() { board[1][1] = 5; change[1][1] = 1; board[1][2] = 3; change[1][2] = 1; board[1][5] = 7; change[1][5] = 1; board[2][1] = 6; change[2][1] = 1; board[2][4] = 1; change[2][4] = 1; board[2][5] = 9; change[2][5] = 1; board[2][6] = 5; change[2][6] = 1; board[3][2] = 9; change[3][2] = 1; board[3][3] = 8; change[3][3] = 1; board[3][8] = 6; change[3][8] = 1; board[4][1] = 8; change[4][1] = 1; board[4][5] = 6; change[4][5] = 1; board[4][9] = 3; change[4][9] = 1; board[5][1] = 4; change[5][1] = 1; board[5][4] = 8; change[5][4] = 1; board[5][6] = 3; change[5][6] = 1; board[5][9] = 1; change[5][9] = 1; board[6][1] = 7; change[6][1] = 1; board[6][5] = 2; change[6][5] = 1; board[6][9] = 6; change[6][9] = 1; board[7][2] = 6; change[7][2] = 1; board[7][7] = 2; change[7][7] = 1; board[7][8] = 8; change[7][8] = 1; board[8][4] = 4; change[8][4] = 1; board[8][5] = 1; change[8][5] = 1; board[8][6] = 9; change[8][6] = 1; board[8][9] = 5; change[8][9] = 1; board[9][5] = 8; change[9][5] = 1; board[9][8] = 7; change[9][8] = 1; board[9][9] = 9; change[9][9] = 1; } bool Sudoku::Check_Conflicts(int p, int i, int j) { for(int k = 1; k <= 9; k++) if(board[i][k] == p) return false; for(int q = 1; q <= 9; q++) if(board[q][j] == p) return false; /* *00 000 000 */ if((j == 1 || j == 4 || j == 7) && (i == 1 || i == 4 || i == 7)) { if(board[i][j+1] == p || board[i][j+2] == p || board[i+1][j] == p || board[i+2][j] == p || board[i+1][j+1] == p || board[i+1][j+2] == p || board[i+2][j+1] == p || board[i+2][j+2] == p)return false; } /* 000 000 *00 */ if((j == 1 || j == 4 || j == 7) && (i == 3 || i == 6 || i == 9)) { if(board[i-1][j] == p || board[i-2][j] == p || board[i][j+1] == p || board[i][j+2] == p || board[i-1][j+1] == p || board[i-1][j+2] == p || board[i-2][j+1] == p || board[i-2][j+2] == p)return false; } /* 000 *00 000 */ if((j == 1 || j == 4 || j == 7) && (i == 2 || i == 5 || i == 8)) { if(board[i-1][j] == p || board[i-1][j+1] == p || board[i-1][j+2] == p || board[i][j+1] == p || board[i][j+2] == p || board[i+1][j] == p || board[i+1][j+1] == p || board[i][j+2] == p)return false; } /* 0*0 000 000 */ if((j == 2 || j == 5 || j == 8) && (i == 1 || i == 5 || i == 7)) { if(board[i][j-1] == p || board[i][j+1] == p || board[i+1][j+1] == p || board[i+1][j-1] == p || board[i+1][j] == p || board[i+2][j-1] == p || board[i+2][j] == p || board[i+2][j+2] == p)return false; } /* 000 0*0 000 */ if((j == 2 || j == 5 || j == 8) && (i == 2 || i == 5 || i == 8)) { if(board[i-1][j] == p || board[i-1][j-1] == p || board[i-1][j+1] == p || board[i][j+1] == p || board[i][j-1] == p || board[i+1][j+1] == p || board[i+1][j] == p || board[i+1][j-1] == p)return false; } /* 000 000 0*0 */ if((j == 2 || j == 5 || j == 8) && (i == 3 || i == 6 || i == 9)) { if(board[i][j-1] == p || board[i][j+1] == p || board[i-1][j] == p || board[i-1][j+1] == p || board[i-1][j-1] == p || board[i-2][j] == p || board[i-2][j+1] == p || board[i-2][j-1] == p) return false; } /* 00* 000 000 */ if((j == 3 || j == 6 || j == 9) && (i == 1 || i == 4 || i == 7)) { if(board[i][j-1] == p || board[i][j-2] == p || board[i+1][j] == p || board[i+1][j-1] == p || board[i+1][j-2] == p || board[i+2][j] == p || board[i+2][j-1] == p || board[i+2][j-2] == p) return false; } /* 000 00* 000 */ if((j == 3 || j == 6 || j == 9) && (i == 2 || i == 5 || i == 8)) { if(board[i-1][j] == p || board[i-1][j-1] == p || board[i-1][j-2] == p || board[i][j-1] == p || board[i][j-2] == p || board[i+1][j] == p || board[i+1][j-1] == p || board[i+1][j-2] == p) return false; } /* 000 000 00* */ if((j == 3 || j == 6 || j == 9) && (i == 3 || i == 6 || i == 9)) { if(board[i][j-1] == p || board[i][j-2] == p || board[i-1][j] == p || board[i-1][j-1] == p || board[i-1][j-2] == p || board[i-2][j] == p || board[i-2][j-1] == p || board[i-2][j-2] == p) return false; } return true; } void Sudoku::Help_Solve(int i, int j) { if(j > 9) { i = i+1; j = 9; } if(j == 0) { i = i-1; j = 9; } int k = board[i][j]; for(int p = 1; p <= 9; p++) if(Game.Check_Conflicts(p, i, j) && change[i][j] == 0 && p != k) { board[i][j] = p; return; } if(change[i][j-1] == 1) { while(change[i][j-1] == 1) { j--; if(j == 0) { i = i-1; j = 9; } if(change[i][j-1] == 0) return Game.Help_Solve(i, j-1); } } return board[i][j] = 0, Game.Help_Solve(i, j-1); //Тук махнах board[i][j] = 0 } void Sudoku::Solve() { for(int i = 1; i <= 9; i++) { for(int j = 1; j <= 9; j++) { if(board[i][j] == 0 && change[i][j] == 0) { Game.Help_Solve(i, j); } } } } int main() { Game.Add_First_Cord(); Game.Solve(); Game.Print_Board(); system("pause"); return 0; }
  5. boy1

    Какво е нужно за да си програмист

    Ясно! Благодаря много на всички за съветите
  6. boy1

    Какво е нужно за да си програмист

    За алгоритми ще свърши ли работа тази книга: Програмиране=++алгоритми /Съдържание/
  7. boy1

    Какво е нужно за да си програмист

    Благодаря, че се отзовахте. Значи C++ няма голамо бъдеще? Искаше ми се да се занимавам със C++. А за да правя софтуер трябва ли да знам неща като MySQL, Windows Forms Application, SDL, SDK, QT или някакви такива допълнителни работи?
  8. Здравейте! Бих искал да Ви попитам какви знания трябва да има човек, за да стане програмист. Аз съм още ученик, но искам да се ориентирам от сега. Знам долу горе C++, но още го уча. То е ясно, че само със един език не става, та затова Ви питам още какво трябва да знам? И ако някой може да каже дали е задължително да завърша университет, за да стана програмист. И ако да, може ли да ми препоръчате някой от негов личен опит? Нядавам се въпросът ми да не е много малоумен. Питам Вас, защото съм от малък град и не познавам никакъв програмист към когото да се обърна.
  • Разглеждащи това в момента   0 потребители

    Няма регистрирани потребители разглеждащи тази страница.

×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.