码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 4499 dfs(通化邀请赛)

时间:2015-03-11 13:00:49      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:dfs


题意是给你5*5的棋盘   里面有棋子  问能在棋盘里最多放多少的炮(条件是炮之间不能互相攻击) 

思路:棋盘很小 很容易想到dfs解决    先找出所有的空格(好像网上都没这样做的   个人习惯吧  不想用for循环去找)    然后依次放或不放炮   深搜到底 至于判断能不能攻击    直 接用for循环来判断   map用来标记有没有棋子  mark标记有没有放置炮   


#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

int map[10][10],mark[10][10],cont;
int num[30][3];
int sum;
int min(int a,int b)
{
    return a<b?a:b;
}
int max(int a,int b)
{
    return a>b?a:b;
}
int judge(int x1,int y1,int x2,int y2)
{
    int t=0;
    if(x1==x2)
    {
        for(int i=min(y1,y2)+1;i<max(y1,y2);i++)
        if(map[x1][i]) t++;
        if(t==1) return 1;
    }
    else 
    {
        t=0;
        for(int i=min(x1,x2)+1;i<max(x1,x2);i++)
        if(map[i][y1]) t++;
        if(t==1) return 1;
    }
    return 0;
}
int dfs(int t,int c)
{   
    int i;
    if(t==cont+1)
    {
        if(c>sum) sum=c;
        return 0;
    }    
    dfs(t+1,c);
    for(i=1;i<t;i++)
    {
        if(mark[num[i][1]][num[i][2]]==1)
        if((num[t][1]==num[i][1]||num[t][2]==num[i][2])&&judge(num[t][1],num[t][2],num[i][1],num[i][2])) break;
    }
    if(i==t)
    {
        map[num[t][1]][num[t][2]]=mark[num[t][1]][num[t][2]]=1;
        dfs(t+1,c+1);
        map[num[t][1]][num[t][2]]=mark[num[t][1]][num[t][2]]=0;
    }
    return 0;
}
int main()
{
    int i,j,q,a,b,n,m;
    while(~scanf("%d%d%d",&n,&m,&q))
    {
        memset(map,0,sizeof(map));
        for(i=1;i<=q;i++)
        {
            scanf("%d%d",&a,&b);
            map[a+1][b+1]=1;
        }
        memset(mark,0,sizeof(mark));
        cont=0;
        for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        {
            if(map[i][j]==0)
            {
                cont++;
                num[cont][1]=i;
                num[cont][2]=j;
            }
        }
        sum=0;
        if(cont==0) printf("0\n");
        else
        {
            dfs(2,0);
            map[num[1][1]][num[1][2]]=mark[num[1][1]][num[1][2]]=1;
            dfs(2,1);
            printf("%d\n",sum);
        }    
    }
    return 0;
}

hdu 4499 dfs(通化邀请赛)

标签:dfs

原文地址:http://blog.csdn.net/zxf654073270/article/details/44196003

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!