#include #include #include #include #include "CGI.hpp" using namespace std; char m_values[9][9][9]; /************************************************************ * * * * GetIJK() * * * ************************************************************/ void GetIJK(string &buf, int &i, int &j, int &k){ size_t cnt=0, len = buf.size(); i=j=k=-1; string tmp; while (cnt < len && isdigit(buf[cnt])) tmp += buf[cnt++]; if (tmp.size()) i=atoi(tmp.c_str()); cnt++; tmp=""; while (cnt < len && isdigit(buf[cnt])) tmp += buf[cnt++]; if (tmp.size()) j=atoi(tmp.c_str()); cnt++; tmp=""; while (cnt < len && isdigit(buf[cnt])) tmp += buf[cnt++]; if (tmp.size()) k=atoi(tmp.c_str()); if (i>=0 && j>=0 && k>=0){ if (i<9 && j<9 && k<9){ return; } } i=j=k=-1; return; } /************************************************************ * * * * SetValues() * * * ************************************************************/ void SetValues(int i, int j, int k, bool reset){ int cnt, setval = (reset ? 0 : -1); m_values[i][j][k] = (reset ? 0 : 1); for (cnt = 0; cnt < 9; ++cnt){ if (k != cnt) m_values[i][j][cnt] = setval; } for (cnt = 0; cnt < 9; ++cnt){ if (j != cnt) m_values[i][cnt][k] = setval; } int row_i = i/3; int col_i = i%3; int row_j = j/3; int col_j = j%3; for (cnt=0; cnt<3; ++cnt){ int newi = (row_i*3)+cnt; if (newi != i){ int newj = row_j*3; m_values[newi][newj][k] = setval; m_values[newi][newj+1][k] = setval; m_values[newi][newj+2][k] = setval; } } for (cnt=0; cnt<3; ++cnt){ int newi = col_i+(cnt*3); if (newi != i){ m_values[newi][col_j][k] = setval; m_values[newi][col_j+3][k] = setval; m_values[newi][col_j+6][k] = setval; } } } /************************************************************ * * * * main() * * * ************************************************************/ int main(){ cout << "Content-type: text/html\n\n"; cout << "C++ SuDoKu Bookeeping Interface\n"; cout << "\nWelcome to Mitakeet's C++ SuDoKu Bookeeping Interface. This removes some of the tedious bookeeping necessary when playing the game.\n
\n"; cout << "
\n"; CGI cgi; int i, j, k, cnt = 0; for (i=0; i<9; ++i){ for (j=0; j<9; ++j){ for (k=0; k<9; ++k){ m_values[i][j][k] = 0; } } } map < string, string > mapCGI; set < string > setPrev; if (0){//testing/running in debugger // mapCGI["prev"] = "0,0,0|0,1,0|8,8,8"; // mapCGI["prev"] = "0,0,0|8,8,8|6,6,6"; // mapCGI["7,7,7"] = "1"; mapCGI["1,0,1"] = "1"; }else{ cgi.GetPostMap(mapCGI); } string newval, hidden = mapCGI["prev"]; map < string, string >::const_iterator iter = mapCGI.begin(); for (; iter != mapCGI.end(); ++iter){ if (iter->first == "prev") continue; newval = iter->first; cnt++; } if (cnt && cnt != 1){ cout << "cnt != 1!\n"; return 0; } if (newval.size()){ stringstream iostr(hidden); string buf, tmp; while (true){ buf = ""; getline(iostr, buf, '|'); if (!buf.size()){ if (iostr.eof()) break; continue; } setPrev.insert(buf); GetIJK(buf, i, j, k); if (i>=0 && j>=0 && k>=0){ SetValues(i, j, k, false); } } if (setPrev.find(newval) == setPrev.end()){//new, add to list if (hidden.size()) hidden += "|"; hidden += newval; GetIJK(newval, i, j, k); if (i>=0 && j>=0 && k>=0){ SetValues(i, j, k, false); } }else{//this is an 'undo', need to erase from list hidden=""; set < string >::const_iterator iter = setPrev.begin(); for (; iter != setPrev.end(); ++iter){ if (*iter == newval) continue; if (hidden.size()) hidden += "|"; hidden += *iter; } GetIJK(newval, i, j, k); if (i>=0 && j>=0 && k>=0){ SetValues(i, j, k, true); } } } cout << "\n"; cout << "";// border=1>"; for (i=0; i<9; ++i){ if (i && i%3==0){ if (i) cout << ""; cout << ""; } cout << "
\n";// border=1>"; for (j=0; j<9; ++j){ if (j && j%3==0){ if (j) cout << ""; cout << ""; } cout << ""; } cout << "
"; for (k=0; k<9; ++k){ if (k && k%3==0){ if (k) cout << ""; cout << ""; } cout << ""; } cout << "
"; if (m_values[i][j][k] < 0){ cout << "X"; }else{ cout << ""; } cout << "
\n"; cout << "
\n"; } cout << "
\n"; cout << "
\n"; return 0; }