/* 深搜解法 总体思想是这样的 用map存放地图 元素值为2表示是墙 1表示是碉堡 0表示是街道 从左上角第一个开始扫描一直扫描到右下角最后一个位置 找到可以放置碉堡的地方然后放置第一个碉堡 标记该位置为碉堡放置位置 然后再从头扫描可以放置碉堡的地方 重复上述过程直到找不到可以放置碉堡的位置的时候为止 用ans记录深搜的最大深度即为可以放置的最大碉堡数目 */ #define LOCAL #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<cstdlib> #include<cctype> #include<iomanip> #include<string> #include<algorithm> #include<ctime> #include<stack> #include<queue> #include<vector> using namespace std; int n,ans,map[5][5]; bool legal(int x,int y)//判断当前位置是否可放置碉堡 { int i; //依次检索四个方向如果出现了不可放置的情况直接返回当前位置不可用 //若没有则待定 if(map[x][y]) return false; if(x>0)//up for(i=x-1;i>=1;i--) if(map[i][y]==2) break; else if(map[i][y]==1) return false; if(x<n)//down for(i=x+1;i<=n;i++) if(map[i][y]==2) break; else if(map[i][y]==1) return false; if(y>0)//left for(i=y-1;i>=1;i--) if(map[x][i]==2) break; else if(map[x][i]==1) return false; if(y<n)//right for(i=y+1;i<=n;i++) if(map[x][i]==2) break; else if(map[x][i]==1) return false; return true;//若检索四个方向均没有出现不可放置的情况 //则该位置肯定可以放置一个碉堡 } void DFS(int m)//用m记录深搜深度 { int i,j; for(i=1;i<=n;i++)//从左上角第一个位置到右下角最后一个位置依次进行检索 { for(j=1;j<=n;j++) { if(legal(i,j))//如果可放置碉堡 { map[i][j]=1;//标记为已放置 DFS(m+1);//进入下一层深搜 map[i][j]=0;//返回时反标记 } } } ans=(ans>m?ans:m);//记录最大深搜深度 } int main() { #ifdef LOCAL freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); #endif int i,j;char ch; while(cin>>n&&n) { memset(map,0,sizeof(map));//初始化地图 for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { cin>>ch; if(ch=='X')//标记墙的位置 map[i][j]=2; } } ans=0; DFS(0);//从深度为0开始深搜 cout<<ans<<endl; } return 0; }
zoj 1002 Fire Net
最新推荐文章于 2022-06-16 21:01:06 发布