题目地址: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 |