这道题看着麻烦,实际就是讲了棋盘放位置的策略。总体和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 10int 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;}
ACM-Fire Net
原文地址:https://www.cnblogs.com/x739400043/p/8505457.html