| 发表于:2007-06-28 18:15:2327楼 得分:0 |
编译没问题,运行出错,那太正常了,逻辑错误是编译器检查不出来的,不过以前自己写了个8皇后的程序,可以看一下. #include <iostream> #include <cstdio> #include <ctime> #include <cmath> using namespace std; void queen(int** array, int row, file* fp); bool isavailable(int** array, int y, int x); bool isresult(int** array); int main(int arg, char** argv) { int** array; // 分配空间 array = new int*[8]; for (int i = 0; i < 8; i++) { array[i] = new int[8]; } // 初始化皇后 for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { array[i][j] = 0; } } file* fp = fopen( "data.txt ", "w "); queen(array, 0, fp); fclose(fp); // 释放空间 for (int i = 0; i < 8; i++) { delete[] array[i]; } delete array; array = null; return 0; } void queen(int** array, int row, file* fp) { static int size = 0; if (row > 7) { return; } //int i = row; for (int j = 0; j < 8; j++) { // 如果合法 if (isavailable(array, row, j)) { array[row][j] = 1; // 当前位置合法,赋值后,进入下一行 queen(array, row + 1, fp); // 如果退回来后不是结果,则把刚设置的当前位置重新赋值为0 // 是结果,则打印出来 if (isresult(array)) { // 把结果写入文件 fputc( '\n ', fp); fputs( "*********************************** ", fp); fprintf(fp, " %d ", size++); fputs( "*********************************** ", fp); fputc( '\n ', fp); for (int m = 0; m < 8; m++) { for (int n = 0; n < 8; n++) { if (array[m][n] == 1) { fputc( '# ', fp); fputc( ' ', fp); fputc( ' ', fp); } else { fputc( 'o ', fp); fputc( ' ', fp); fputc( ' ', fp); } } fputc( '\n ', fp); } } array[row][j] = 0; } } } bool isavailable(int** array, int row, int column) { // 第y行,x列 int i, j; // 检查y行 for (i = 0; i < 8; i++) { if (array[row][i] != 0) { return false; } } // 检查x列 for (j = 0; j < 8; j++) { if (array[j][column] != 0) { return false; } } // 检查对角向左上 i = row; j = column; while (i > = 0 && j > = 0) { if (array[i][j] != 0) { return false; } i--; j--; } // 检查对角向右上 i = row; j = column; while (i > = 0 && j < 8) { if (array[i][j] != 0) { return false; } i--; j++; } // 检查对角向左下 i = row; j = column; while (i < 8 && j > = 0) { if (array[i][j] != 0) { return false; } i++; j--; } // 检查对角向右下 i = row; j = column; while (i < 8 && j < 8) { if (array[i][j] != 0) { return false; } i++; j++; } return true; } bool isresult(int** array) { int size = 0; // 皇后个数 // 统计皇后个数 for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { if (array[i][j] != 0) { size++; } } } // 没有8个皇后,说明不是结果 if (size != 8) { return false; } return true; } | | |
|