题目链接
这道题目不难,应该说蛮简单的。
可是我却做了一晚上。。还是最后不行参照别人的代码的。看来距离大神的距离不是一般的长啊。
思路:
用DFS遍历,看来DFS基本功还是太不扎实了。
代码及解释如下:
<span style="font-size:18px;">#include <iostream> using namespace std; char s[10][10];//用*表示放置碉堡 int maxnumber, n; bool judge(int x, int y)//判断是否可以再放置 { for (int i = x - 1; i >= 1; i--){ if (s[i][y] == 'X') break; if (s[i][y] == '*') return false; } for (int j = y - 1; j >= 1; j--){ if (s[x][j] == 'X') break; if (s[x][j] == '*') return false; } return true; } void dfs(int x, int y, int number) { if (x == n&&y == n) { if (s[x][y] == '.'&&judge(x, y)) number++; if (maxnumber < number) maxnumber = number; return; } //若为X或者不可放置则进行递归且number不变 if (!judge(x, y) || s[x][y] == 'X') { if (x < n) dfs(x + 1, y, number); else dfs(1, y + 1, number); //若x已经等于N了,则置为1重新查询 } else{ s[x][y] = '*';//放置 if (x < n) dfs(x + 1, y, number + 1); else dfs(1, y + 1, number + 1); //回溯 s[x][y] = '.';//将标记放回 if (x < n) dfs(x + 1, y, number); else dfs(1, y + 1, number); } return; } int main() { while (cin >> n&&n) { maxnumber = 0; for (int i = 1; i <= n; i++) //从1开始计算 for (int j = 1; j <= n; j++) cin >> s[i][j]; dfs(1, 1, 0); cout << maxnumber << endl; } return 0; }</span>