문제 출처 : http://www.jungol.co.kr/prog/Hanal/hanalView.php?qs_code=1889
나의 답 : 아래 코드이다.. 하지만 N = 13일경우 1초내에 계산이 안되서 accepted되었다..ㅠㅠ 속도 향상할 수 있는 point를 찾아야 겠다..
#include#include #define DEBUG 0 #define MAX_QUEENS 14 int g_cols[MAX_QUEENS]; // represent of chess board // g_cols[index] : column, index : row int g_num_queens; int g_num_possible_sequence; void SetInputFromFile(const char* fileName); void PrintAnswerToFile(const char* fileName); void NQueen(int irow); int isThreathen(int irow); void Print_Queen(); int main() { SetInputFromFile("input.txt"); g_num_possible_sequence = 0; NQueen(0); PrintAnswerToFile("output.txt"); return 0; } void SetInputFromFile(const char* fileName) { FILE *input = fopen(fileName, "r"); if (input == NULL) { fprintf(stderr, "Can NOT open file: \n", fileName); goto bail; } //TODO: fscanf(input, "%d", &g_num_queens); fclose(input); return; bail: if (input != NULL) fclose(input); } void PrintAnswerToFile(const char* fileName) { FILE *output = fopen(fileName, "w"); if (output == NULL) { fprintf(stderr, "Can NOT open file: \n", fileName); goto bail; } //TODO: fprintf(output, "%d\n", g_num_possible_sequence); fclose(output); return; bail: if (output != NULL) fclose(output); } void NQueen(int irow) { int icol; if (DEBUG) {printf("nqueen(%d)\n", irow + 1); Print_Queen();} if (isThreathen(irow)) { if (DEBUG) {printf("irow(%d) is Threathen\n", irow);Print_Queen();} return; } if (irow == g_num_queens) { if (DEBUG) {printf("completed\n");Print_Queen();} g_num_possible_sequence++; return; } for (icol = 1; icol <= g_num_queens; icol++) { g_cols[irow + 1] = icol; NQueen(irow + 1); } } int isThreathen(int irow) { int k; // irow 보다 작은 row를 가리키는 index // TODO : rename k for (k = 1; k < irow; k++) { if (g_cols[irow] == g_cols[k] || abs(g_cols[irow] - g_cols[k]) == (irow - k)) { return 1; } } return 0; } void Print_Queen() { int i; for (i = 1; i <= g_num_queens; i++) { printf("%d ", g_cols[i]); } printf("\n"); }