#include <stdio.h>
#define DEBUG 1
#define TESTCASES 8
#define IN(x) ( (x) >= 1 && (x) <= size ? 1 : 0 )
#define WITHIN(x, y) ( IN(x) && IN(y) ? 1 : 0 )
int size;
int conflict[14][14];
int solution[14];
int numOfSolutions;
int directionArray[4][2] = {{1, 1}, {-1, -1}, {-1, 1}, {1, -1}};
void printConflict(){
int i, j;
for (i = 1; i <= size; i++)
for (j = 1; j <= size; j++)
printf("%d%c", conflict[i][j], j == size ? '\n' : ' ');
printf("\n");
}
void setConflict(int row, int column, int flag){
int i;
for (i = 1; i <= size; i++)
conflict[i][column] += flag;
int directionIndex;
for (directionIndex = 0; directionIndex < 4; directionIndex++){
int deltaX = directionArray[directionIndex][0];
int deltaY = directionArray[directionIndex][1];
int x = row + deltaX;
int y = column + deltaY;
while ( WITHIN(x, y) ){
conflict[x][y] += flag;
x += deltaX;
y += deltaY;
}
}
}
void dfs(int row){
//printConflict();
if (row > size){
if (++numOfSolutions < 4){
int i;
for (i = 1; i <= size; i++)
printf("%d%c", solution[i], i == size ? '\n' : ' ');
}
return;
}
int column;
for (column = 1; column <= size; column++){
if (conflict[row][column] == 0){
setConflict(row, column, 1);
solution[row] = column;
dfs(row + 1);
setConflict(row, column, -1);
}
}
}
int main(){
#if DEBUG
int testCase;
for (testCase = 1; testCase <= TESTCASES; testCase++){
char inputFileName[20] = "inputx.txt";
inputFileName[5] = '1' + (testCase - 1);
freopen(inputFileName, "r", stdin);
printf("\n#%d\n", testCase);
#endif
scanf("%d", &size);
numOfSolutions = 0;
dfs(1);
printf("%d\n", numOfSolutions);
#if DEBUG
}
#endif
return 0;
}
USACO 1.5 Checker Challenge (DFS)
最新推荐文章于 2018-12-07 19:13:29 发布