Fire NetTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 14476 Accepted Submission(s): 8751 Problem Description Suppose that we have a square city with straight streets. A map of a city is a square board with n rows and n columns, each representing a street or a piece of wall. Input The input file contains one or more map descriptions, followed by a line containing the number 0 that signals the end of the file. Each map description begins with a line containing a positive integer n that is the size of the city; n will be at most 4. The next n lines each describe one row of the map, with a '.' indicating an open space and an uppercase 'X' indicating a wall. There are no spaces in the input file. Output For each test case, output one line containing the maximum number of blockhouses that can be placed in the city in a legal configuration. Sample Input 4 .X.. .... XX.. .... 2 XX . X 3 . X . X . X . X . 3 . . . .XX .XX 4 .... .... .... .... 0 Sample Output 5 1 5 2 4 Source |
题意:给一张地图,点 代表空地,X 代表墙,在 点 上可以建炮台,条件是 在同一横同一列最多只能建一个炮台(除非两个炮台 之间有墙相隔),问最多可以建多少个炮台?
题解:dfs深搜,参考 https://www.cnblogs.com/pangblog/p/3294053.html
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int n,ans=0;
char s[10][10];
void dfs(int sum){ // 为此从最左上角开始递归
if(sum>ans){
ans=sum;
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(s[i][j]=='.'){
int leap=0;
for(int k=0;k<4;k++){
int xx=i,yy=j;
while(1){
if(k==0){
xx=xx+1;
yy=yy+0;
}
else if(k==1){
xx=xx-1;
yy=yy+0;
}
else if(k==2){
xx=xx+0;
yy=yy+1;
}
else if(k==3){
xx=xx+0;
yy=yy-1;
}
if(xx<0||yy<0||xx>=n||yy>=n||s[xx][yy]=='X')
break;
else if(s[xx][yy]=='P'){
leap=1;
break;
}
}
}
if(!leap){
s[i][j]='P';
dfs(sum+1); // 递归 直到在第一个位置放置炮台这个搜索结束
/* PX..
....
XX..
.... */
s[i][j]='.'; // 第一个位置不放置炮台又执行循环体下一个为空地的点
/* .X..
....
XX..
.... */
}
}
}
}
}
int main(){
while(scanf("%d",&n),n){
for(int i=0;i<n;i++)
scanf(" %s",s[i]);
ans=0;
dfs(0);
printf("%d\n",ans);
}
return 0;
}