rightplace函数:
bool sudokutest::rightplace(int g, int h)//检测九宫格里的每个数字是否符合数独要求 { int row, col; row = g / 9; col = g % 9; int i, j; for (i = 0; i < 9; i++) //对该数字所在的行查找是否有相同的数字 { if (sudoku[row][i] == h) return false; } for (i = 0; i < 9; i++) //对该数字所在的行查找是否有相同的数字 { if (sudoku[i][col] == h) return false; } int a, b; a = row / 3; b = col / 3; for (i = a * 3; i < a * 3 + 3; i++) //在每一个宫里判断是否有相同的数字出现 { for (j = b * 3; j < b * 3 + 3; j++) { if (sudoku[i][j] == h) return false; } } return true; }put函数:
void sudokutest::put(int n) { int row, col; row = n / 9; col = n % 9; int i; if (n == 81)//达到81,说明九宫格已经被填满 { pd = true; return; } if (sudoku[row][col] != 0)//找到没有被填的格子 { put(n + 1); } else { if (n % 9 == 0)//每一行将数组随机调换 random_shuffle(&(a[0]), &(a[9])); for (i = 0; i < 9; i++) { if (rightplace(n, a[i])) { sudoku[row][col] = a[i]; put(n + 1); if (pd) return; sudoku[row][col] = 0; } } } }main函数主要:
int main(int argc, char *argv[])//实现可以从cmd输入sudoku.exe -c 1000格式 { int i, j, temp = 0; int k = 0, num = 0; int p = 0; stringstream stream; string na,ne; int n; if (argc!=3) { cout << "ERROR!!!more or less sentences" << endl; return 0; } else { ne = argv[1]; if (ne == "-c") { na = argv[2]; int l = na.length(); for (int m = 0; m < l; m++)//判断输入的字符串是不是纯数字 { if (na[m] <= 57 && na[m] >= 48)//数字0-9的ascii码为48-57,若发现数字,p就加一 { p++; } } if (p != l)//如果最后的p与字符串长度不相同,就说明输入的字符串不是纯数字 { cout << "please enter an integer" << endl; return 0; } stream << na;//将字符串转换成数字 stream >> n; stream.clear(); freopen("./sudoku.txt", "w", stdout); while (n--) { sudokutest s; s.first(); pd = false; s.put(0); s.print(); } } else { cout << "Your input format is wrong!!!" << endl; } } } 最主要的就是这三个代码,put函数使用回溯方法进行数字的放入,right place用来判断每行每列每宫是否有重复,是否符合数独的规定。因为测试要使用cmd,一开始不知道要使用argc ,argv[]这种方法,不能实现sudoku.exe -c 1000这样语句的实现。由于会出现-c abc或者-c 12r这样的错误语句,故需要判定输入的字符串是否为纯数字。cmd输入测试: 输出结果:
转载于:https://www.cnblogs.com/linqiaona/p/7511477.html
相关资源:各显卡算力对照表!