HDU 4499 Cannon

来源:互联网 发布:程序员第一天上班干嘛 编辑:程序博客网 时间:2024/06/02 13:03

题目:

http://acm.hdu.edu.cn/showproblem.php?pid=4499

题意:

给出一个最大5*5的图,其中有的点已经有了一些棋子,现在往里面放象棋中的炮,要求所有炮互相之间不能打到对方,求最多能放多少个炮。

思路:

暴力搜索,因为每一行最多也就能放3个炮,不到2^15的复杂度,只要每次判断当前点能否放置时写好就行了。隔一个可以打,隔一个以上棋子就是安全的了。

代码:

#define N 11int n,m;int flag,sum,ave,ans,res,len,ans1,ans2;int g[N][N];void dfs(int x,int y,int now){    res=max(res,now);    int xx=x,yy=y;    for(;xx<n;xx++)    {        for(;yy<m;yy++)        {            if(g[xx][yy]!=0)                continue;            flag=0;ans=1;            for(int i=xx-1;ans&&i>=0;i--)            {                if(flag==1&&g[i][yy]==2)                    ans=0;                if(g[i][yy])                    flag++;            }            flag=0;            for(int i=yy-1;ans&&i>=0;i--)            {                if(flag==1&&g[xx][i]==2)                    ans=0;                if(g[xx][i])                    flag++;            }            if(ans)            {                g[xx][yy]=2;                dfs(xx,yy,now+1);                g[xx][yy]=0;            }        }        yy=0;    }}int main(){    int i,j,k,kk,t,x,y,z;    while(scanf("%d%d%d",&n,&m,&k)!=EOF&&n)    {        memset(g,0,sizeof(g));        for(i=0;i<k;i++)        {            scanf("%d%d",&x,&y);            g[x][y]=1;        }        res=0;        dfs(0,0,0);        printf("%d\n",res);    }    return 0;}













0 0