ACM-Fire Net
这道题看着麻烦,实际就是讲了棋盘放位置的策略。总体和n皇后问题很类似。
// Fire Net.cpp : 定义控制台应用程序的入口点。 // //解题思路: //1.类似n皇后问题,上下左右不能有重复,只检测上方和左方即可,下面的没有放到,不需要检查。 //2.走斜角坐标,x = pos/n,y = pos % n //3.每个坐标存在能放和不能放两种情况 #include "stdafx.h" #include <stdio.h> #include <string.h> #define M 10 int n,ans; char map[M][M]; int check(int x, int y) { if (map[x][y] == 'X') return 0; //左方 for (int col = y - 1; col >= 0; col--) { if (map[x][col] == 'X') break; if (map[x][col] == '#') return 0; } //上方 for (int row = x - 1; row >= 0; row--) { if (map[row][y] == 'X') break; if (map[row][y] == '#') return 0; } return 1; } void DFS(int pos, int sum) { int x = pos / n, y = pos % n;//x,y 的位置 if (pos == n * n) { ans = ans > sum? ans:sum; return; } if (check(x, y)) { map[x][y] = '#'; DFS(pos + 1, sum + 1); map[x][y] = '.'; } DFS(pos + 1, sum); } int main() { while (~scanf("%d", &n) && n) { memset(map, '\0', sizeof(map)); for (int i = 0; i < n; i++) scanf("%s", &map[i]); ans = 0; DFS(0,0); printf("%d\n", ans); } return 0; }