#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 allQueensPlacedState;
int solution[14];
int numOfSolutions;
void printColumnsCanPlaceIn(int columnsCanPlaceIn){
int i;
for (i = size - 1; i >= 0; i--)
printf("%d ", (columnsCanPlaceIn >> i) & 1 ? 1 : 0);
printf("\n");
}
void placeQueen(int row, int columnState, int leftDiagonalState, int rightDiagonalState){
if (columnState == allQueensPlacedState){
numOfSolutions++;
if (numOfSolutions < 4){
int i;
for (i = 1; i <= size; i++)
printf("%d ", solution[i]);
printf("\n");
}
}
int columnsCanPlaceIn = allQueensPlacedState & ~(columnState | leftDiagonalState | rightDiagonalState);
//printColumnsCanPlaceIn(columnsCanPlaceIn);
while (columnsCanPlaceIn != 0){
//取columnsCanPlaceIn最后边的1赋给columnToPlaceIn
int columnToPlaceIn;
int i;
for (i = 0; i < size; i++){
if( ((1 << i) & columnsCanPlaceIn) != 0){
columnToPlaceIn = 1 << i;
if (numOfSolutions < 4)
solution[row] = i + 1;
break;
}
}
columnsCanPlaceIn = columnsCanPlaceIn - columnToPlaceIn;
placeQueen(row + 1,
columnState + columnToPlaceIn,
(leftDiagonalState + columnToPlaceIn) << 1,
(rightDiagonalState + columnToPlaceIn) >> 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);
allQueensPlacedState = (1 << size) - 1;
numOfSolutions = 0;
placeQueen(1, 0, 0, 0);
printf("%d\n", numOfSolutions);
#if DEBUG
}
#endif
return 0;
}
USACO 1.5 Checker Challenge (位操作)
最新推荐文章于 2024-07-30 23:00:20 发布