> http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=2
> 原题地址
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <stack>
const int MAX = 10;
const int INF = 1000000000;
using namespace std;
int n, num, ans;
char maze[MAX][MAX];
bool legal(int row, int col); (判断是否可以放置碉堡)
void dfs(int k, int num);
int main()
{
int i;
while(scanf("%d", &n), n!=0)
{
ans=0;
for(i=0; i<n; i++)scanf("%s", &maze[i]);
num=0;
dfs(0,num);
printf("%d\n", ans);
}
return 0;
}
void dfs(int k, int num)
{
if(k==n*n) (用k来代替i, j. 方便回溯)
{
if(num>ans)ans=num; (更新最大值)
return ;
}
else
{
int i = k/n; (行)
int j = k%n; (列)
if(maze[i][j]=='.'&&legal(i,j))
{
maze[i][j]='@'; (标记当前位置)
dfs(k+1,num+1);
maze[i][j]='.'; (回溯)
}
dfs(k+1,num); (较难理解:用于统计当前位置不放置碉堡的可能的数量)
}
}
bool legal(int row, int col)
{
int i;
for(i=row-1; i>=0; i--) (当前列的上方是否可以放置)
{
if(maze[i][col]=='X')break; (如果有墙,跳出)
else if(maze[i][col]=='@')return false; (如果同一列有炮台,当前位 置不可放置)
}
for(i=row+1; i<n; i++) (下方)
{
if(maze[i][col]=='X')break;
else if(maze[i][col]=='@')return false;
}
for(i=col-1; i>=0; i--) (左方)
{
if(maze[row][i]=='X')break;
else if(maze[row][i]=='@')return false;
}
for(i=col+1; i<n; i++) (右方)
{
if(maze[row][i]=='X')break;
else if(maze[row][i]=='@')return false;
}
return true;
}
ZOJ 1002
最新推荐文章于 2020-05-16 12:38:04 发布