zoukankan      html  css  js  c++  java
  • HDU 4499

    题目大意:

    N*M的棋盘上摆了一些棋子,在剩余位置上尽可能多的摆上炮,使所有炮不能互吃

    dfs+回溯

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #define max(x,y) x>y?x:y;
     5 using namespace std;
     6 int a[30],b[30],visit[7][7],n,m,q,ans;
     7 void dfs(int x,int y,int cnt)//一行一行地搜索,直到找到最后一行时结束时记录最大值
     8 {
     9     if(x>=n){
    10         ans=max(ans,cnt);
    11         return;
    12     }
    13     if(y>=m){
    14         dfs(x+1,0,cnt);
    15         return;
    16     }
    17     if(visit[x][y]){
    18         dfs(x,y+1,cnt);
    19         return;
    20     }
    21     dfs(x,y+1,cnt);
    22     int t,flag=0;
    23     for(t=y-1;t>=0;t--)
    24         if(visit[x][t]) break;
    25     for(int i=t-1;i>=0;i--)
    26     {
    27         if(visit[x][i]==2) {flag=1;break;}
    28         if(visit[x][i]) break;
    29     }
    30     if(flag)return;//判断这一列上是否存在炮互吃
    31     for(t=x-1;t>=0;t--)
    32         if(visit[t][y]) break;
    33     for(int i=t-1;i>=0;i--){
    34         if(visit[i][y]==2) {flag=1;break;}
    35         if(visit[i][y]) break;
    36     }
    37     if(flag) return;//判断这一行上是否存在炮互吃
    38     visit[x][y]=2;
    39     dfs(x,y+1,cnt+1);
    40     visit[x][y]=0;//回溯
    41 }
    42 int main()
    43 {
    44     while(scanf("%d%d%d",&n,&m,&q)!=EOF){
    45         memset(visit,0,sizeof(visit));
    46         for(int i=0;i<q;i++){
    47             scanf("%d%d",&a[i],&b[i]);
    48             visit[a[i]][b[i]]=1;
    49         }
    50         ans=0;
    51         dfs(0,0,0);
    52         printf("%d
    ",ans);
    53     }
    54     return 0;
    55 }
  • 相关阅读:
    java命令模式
    java中介者模式
    java访问者模式
    java状态模式
    java责任链模式
    java策略模式(及与工厂模式的区别)
    github token 位置
    Yii2 Queue队列
    sz与rz
    vim
  • 原文地址:https://www.cnblogs.com/CSU3901130321/p/3959716.html
Copyright © 2011-2022 走看看