您的位置:首页 > 其它

USACO 1.5 Checker Challenge (DFS)

2015-09-26 23:58 465 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息