|
题目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1002
|
|
题目大意: 假想有这么一个由 N*N 个方块组成的城市。每一方块上要么是可能通行的,要么是不可通行的。现在要求你在可通行的方块上设置碉堡,每座碉堡都可以向四面开火,并能打穿整个城除非遇上不可通行的墙,也就是说,在没有墙阻拦的同一条线上,最多只能放置一个碉堡。问题输入城市信息后,要求你输出最大的可放置的碉堡数目。
解题思路: 最初,我们设想城市里没有任何一座碉堡,然后从左上角开始寻找第一个可以放置碉堡的地方,当找到可以放置碉堡的空位后,我们标记这地点为碉堡,接着又从左上角开始寻找第一个可以放置碉堡的地方。设置一个变量来存最大的可放置数,如果寻找到了右下角。我们继续还原另一个操作。这个我也说不清楚,不好说,看代码吧,嘻嘻....
|
|
源代码:
#include <iostream>
using namespace std;
char map[4][4];
int n,best;
bool canPut(int y,int x){
int i;
if(map[y][x] == '.'){
for(i=x-1;i>=0;i--)//向左查看
if(map[y][i]=='O')
return false;
else if(map[y][i]=='X')
break;;
for(i=x+1;i<n;i++)//向右查看
if(map[y][i]=='O')
return false;
else if(map[y][i]=='X')
break;
for(i=y-1;i>=0;i--) //向上查看
if(map[i][x]=='O')
return false;
else if(map[i][x]=='X')
break;
for(i=y+1;i<n;i++) //向下查看
if(map[i][x]=='O')
return false;
else if(map[i][x]=='X')
break;
return true;
}
return false;
}
void dfs(int m){
int i,j;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(canPut(i,j)){//测试是否可以放置碉堡
map[i][j]='O'; //标记为碉堡
dfs(m+1);
map[i][j]='.'; //还原,寻找另一个可放置的位置
}
}
}
best = m>best?m:best;
}
int main (){
while(cin>>n,n!=0){
//读取城市地图信息
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
switch(cin.get()){
case '.': map[i][j] = '.';
continue;
case 'X': map[i][j] = 'X';
continue;
}
j--;
}
}
best = 0;
dfs(0);
cout<<best<<endl;
}
return 0;
}
|
| Run Time(ms) Run Memory(KB) 0 188 |
ZJU ACM 1002碉堡问题解析
775

被折叠的 条评论
为什么被折叠?



