杭电4499 Cannon DFS 搜索

题意:就是给你一个n*m的棋盘,然后上面已经有了 棋子,并给出这些棋子的坐标,但是这些棋子是死的就是不能动,然后让你在棋盘上面摆炮,但是炮之间不能互相吃,吃的规则我们斗懂得 炮隔山打嘛,问你最多能放几个炮

#include   
#include   
#define max(a,b) a>b?a:b;  
int mp[10][10],n,m,q,ans;  
int cal(int x,int y){  
    int mark=0,i;  
    if(mp[x][y]==1)  
        return 0;  
    for(i=y-1;i>=0;i--){  
        if(mp[x][i]==1)  
            mark++;  
        else if(mp[x][i]==2){  
            if(mark==1)  
                return 0;  
            else  
                mark++;  
        }  
    }  
    mark=0;  
    for(i=x-1;i>=0;i--){  
        if(mp[i][y]==1)  
            mark++;  
        else if(mp[i][y]==2){  
            if(mark==1)  
                return 0;  
            else   
                mark++;  
        }  
    }  
    return 1;  
}  
void dfs(int x,int y,int cnt){  
    int tx=x/n,ty=y%m;//这样表示从棋盘每一行开始从左往右查,少了for循环  
    if(n==1) tx=0;  
    if(tx>=n)  
        return;  
    ans=max(ans,cnt);  
    if(cal(tx,ty)){  
        mp[tx][ty]=2;  
        dfs(x+1,y+1,cnt+1);  
        mp[tx][ty]=0;  
        dfs(x+1,y+1,cnt);  
    }  
    else  
        dfs(x+1,y+1,cnt);  
}  
int main(){  
    int i,x,y;  
    while(~scanf("%d%d%d",&n,&m,&q)){  
        memset(mp,0,sizeof(mp));  
        ans=0;  
        for(i=0;i


你可能感兴趣的:(杭电,DFS)