[ZOJ 1002] Fire Net (简单地图搜索)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1002
题目大意:
给你一个n*n的地图,地图上的空白部分可以放棋子,也有墙,问最多能放多少棋子使得棋子两两不会袭击?
棋子袭击当且仅当处在同一行或者同一列上并且中间没有墙的阻隔。
真是好久没写过搜索题了。。这道题都写了这么久!!
直接写dfs(x,y,now) 代表我现在站在x点,y点上,那么就只能产生两种状态,放棋子或者不放棋子。
然后写一个C(x,y)代表当前点能否放置棋子。
什么情况下可以放置棋子呢?
因为我们是从左上角到右下角放的嘛,所以说只需要看左边和上边有没有棋子了。
代码:
1 #include <cstdio> 2 #include <cstdlib> 3 #include <iostream> 4 #include <cstring> 5 #include <algorithm> 6 #include <cctype> 7 #include <vector> 8 #include <map> 9 #include <set> 10 #include <iterator> 11 #include <functional> 12 #include <cmath> 13 #include <numeric> 14 using namespace std; 15 16 typedef long long LL; 17 18 int n; 19 char mp[10][10]; 20 int maxn = 0; 21 22 bool C(int x,int y){ 23 bool hang = true,lie = true; 24 for(int i=x-1;i>=1;i--){ 25 if( mp[i][y]==‘@‘ ) { 26 hang = false; 27 break; 28 } 29 if( mp[i][y]==‘X‘ ){ 30 hang = true; 31 break; 32 } 33 } 34 for(int j=y-1;j>=1;j--){ 35 if( mp[x][j]==‘@‘ ) { 36 lie = false; 37 break; 38 } 39 if( mp[x][j]==‘X‘ ){ 40 lie = true; 41 break; 42 } 43 } 44 return hang&&lie; 45 } 46 47 void dfs(int x,int y,int now){ 48 // printf("x=%d y=%d now=%d\n",x,y,now); 49 if( x==n&&y==n ){ 50 if( mp[x][y]==‘.‘ && C(x,y) ) now = now+1; 51 maxn = max(maxn,now); 52 return; 53 } 54 if( mp[x][y]==‘.‘ && C(x,y) ){ 55 mp[x][y] = ‘@‘; 56 if(y+1<=n) dfs(x,y+1,now+1); 57 else if(x+1<=n) dfs(x+1,1,now+1); 58 mp[x][y] = ‘.‘; 59 } 60 if(y+1<=n) dfs(x,y+1,now); 61 else if(x+1<=n) dfs(x+1,1,now); 62 } 63 64 int main(){ 65 // freopen("output.txt","w",stdout); 66 while(scanf("%d",&n)!=EOF&&n){ 67 if( n==0 ) break; 68 maxn = 0; 69 for(int i=1;i<=n;i++){ 70 scanf("%s",mp[i]+1); 71 } 72 dfs(1,1,0); 73 printf("%d\n",maxn); 74 } 75 return 0; 76 }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。