《演算法的樂趣》中數獨的求解
// sudoku.cpp : 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include #include using namespace std;
#define skd_row_limet 9
#define skd_col_limet skd_row_limet
#define skd_cell_count (skd_col_limet)*(skd_row_limet)
// 數獨單元格結構;
typedef struct stsdkcell
}}suduku_cell;
// 數獨整體結構;
typedef struct stsdkgame
}suduku_game;
int skipfixedcell( suduku_game *pgame, int sp ); // 找到下乙個未填充單元;
void copygamestate( suduku_game *pgame, suduku_game *pnew_state ); // 數獨結構深拷貝;
void printsudokugame( suduku_game *pgame ); // 列印數獨解;
void switchcelltofiexed( suduku_game *pgame, int row, int col, int num ); // 數獨單元賦值並鎖定;
setfindrelatedcells( int row, int col ); // 當前(row,col)的相關單元;
bool exclusivecorrelative( suduku_game *pgame, int row, int col, int num ); // 調整候選值範圍;
bool processsinglescandidature( suduku_game *pgame, int row, int col, int num ); // 單元候選值唯一的處理;
bool setcandidatortofixed( suduku_game *pgame, int row, int col, int num ); // 試探性對數獨單元鎖值;
// 找出數獨解決方案;
void findsudokusolution( suduku_game *pgame, int sp )
sp = skipfixedcell( pgame, sp );
if ( sp >= skd_cell_count )
int row = sp / skd_col_limet;
int col = sp % skd_col_limet;
suduku_cell *curcell = &pgame->cells[row][col];
suduku_game new_state;
for ( auto iter = curcell->candidators.begin(); iter != curcell->candidators.end(); ++iter ) }
}// 數獨單元賦值並鎖定;
void switchcelltofiexed( suduku_game *pgame, int row, int col, int num )
// 當前(row,col)的相關單元;
setfindrelatedcells( int row, int col )
// 相關列;
for ( int irow = 0; irow < skd_row_limet; irow++ )
// 九宮格;
int irows = row / 3 * 3;
int icols = col / 3 * 3;
for ( int irow = irows; irow < irows + 3; irow++ ) }
return cells;
}// 調整候選值範圍;
bool exclusivecorrelative( suduku_game *pgame, int row, int col, int num )
else
}} }
return true;
}// 單元候選值唯一的處理;
bool processsinglescandidature( suduku_game *pgame, int row, int col, int num )
} }return true;
}// 試探性對數獨單元鎖值;
bool setcandidatortofixed( suduku_game *pgame, int row, int col, int num )
if ( !processsinglescandidature( pgame, row, col, num ) )
pgame->fixedcount++;
return true;
}// 列印數獨解;
void printsudokugame( suduku_game *pgame )
cout << endl; }}
// 找到下乙個未填充單元;
int skipfixedcell( suduku_game *pgame, int sp )
else
}return sp;
}// 數獨結構深拷貝;
void copygamestate( suduku_game *pgame, suduku_game *pnew_state ) }}
// 初始化數獨已知資料;
void initsdk( suduku_game *pgame, int* datas )
else
} }}
}} }
}int _tmain(int argc, _tchar* argv)
; datas[0] = 8;
datas[11] = 3;
datas[12] = 6;
datas[19] = 7;
datas[22] = 9;
datas[24] = 2;
datas[28] = 5;
datas[32] = 7;
datas[40] = 4;
datas[41] = 5;
datas[42] = 7;
datas[48] = 1;
datas[52] = 3;
datas[56] = 1;
datas[61] = 6;
datas[62] = 8;
datas[65] = 8;
datas[66] = 5;
datas[70] = 1;
datas[73] = 9;
datas[78] = 4;
suduku_game game;
initsdk( &game, datas );
findsudokusolution( &game, 0 );
system("pause");
return 0;
}
計算機 編碼問題
在計算機中,所有的資料在儲存和運算時都要使用二進位制數表示,例如,a z a z 0 9數字以及還有一些常用的符號 例如 等 在計算機中儲存時也要使用二進位制數來表示,而具體用哪些二進位制數字表示哪個符號,當然每個人都可以約定自己的一套 這就叫編碼 而大家如果要想互相通訊而不造成混亂,那麼大家就必須...
蛇形魔方的計算機求解(DFS)
蛇形魔方 這個玩具是要拼成正方形 蛇形魔方很簡單,不費吹灰之力即可找到解法,也很容易想明白是唯一解。這裡我用深度優先搜尋演算法求解。思路和 都很簡單,就是個簡單的深度優先搜尋,直接上 include includeusing namespace std const int maxdeep 17 co...
計算機S0 S1 S2 S3 S4 S5狀態
standby。即指說系統處於低電源 狀態,在 windows or bios 中可設定螢幕訊號輸出關閉 硬碟停止運轉進入待機狀態 電源燈處於閃爍狀態。此時動一動滑鼠 按鍵盤任一鍵均可叫醒電腦。power standby。和 s1 幾乎是一樣的。即是把 windows 當前存在記憶體中的所有資料儲存...