HDU 1045 Fire Net

来源:互联网 发布:网络无法登陆暴雪 编辑:程序博客网 时间:2024/06/07 05:49

题目链接:戳这里

题目大意:在一个矩阵(最大4*4)中放置大炮,有障碍的地方不能放,且大炮之间不能被打到(大炮只能向上下左右四个方向发射),当然,障碍物可以阻隔大炮。

分析:很明显这是一道搜索题,刚开始想着跟八皇后类似,就联想标记,但是怎样判断与它同行同列是否有大炮,有大炮的话是否有障碍物阻隔呢。最后看了别人的博客,发现了更好的办法,依次对每一个点深搜,只需要判断这个点向上和向左有没有大炮或障碍。

源码 :

#include<iostream>#include<stdio.h>#include<string>#include<string.h>#include<cstring>#include<stack>#include<queue>#include<algorithm>#include<math.h>#include<vector>#include<iomanip>#include<map>#include<list>using namespace std;char mp[5][5];int n,ans;bool judge(int k){int x=k/n,y=k%n;for(int i=x;i>=0;i--){//向上查找if(mp[i][y]=='X')break;if(mp[i][y]=='@')return 0;}for(int i=y;i>=0;i--){//向左查找if(mp[x][i]=='X')break;if(mp[x][i]=='@')return 0;}return 1;}void DFS(int k,int cnt){//k表示点的序号    if(k==n*n){if(ans<cnt)ans=cnt;return;}if(mp[k/n][k%n]=='.'&&judge(k)){mp[k/n][k%n]='@';//标记DFS(k+1,cnt+1);mp[k/n][k%n]='.';//撤销}DFS(k+1,cnt);}int main(){    while(cin>>n,n)    {        for(int i=0;i<n;i++)            cin>>mp[i];ans=0;        DFS(0,0);cout<<ans<<endl;    }return 0;}


0 0