• hdu 4539 郑厂长系列故事——排兵布阵


    郑厂长系列故事——排兵布阵

    Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
    Total Submission(s): 1338    Accepted Submission(s): 478


    Problem Description
      郑厂长不是正厂长
      也不是副厂长
      他根本就不是厂长
      事实上
      他是带兵打仗的团长

      一天,郑厂长带着他的军队来到了一个n*m的平原准备布阵。
      根据以往的战斗经验,每个士兵可以攻击到并且只能攻击到与之曼哈顿距离为2的位置以及士兵本身所在的位置。当然,一个士兵不能站在另外一个士兵所能攻击到的位置,同时因为地形的原因平原上也不是每一个位置都可以安排士兵。
      现在,已知n,m 以及平原阵地的具体地形,请你帮助郑厂长计算该阵地,最多能安排多少个士兵。
     
    Input
    输入包含多组测试数据;
    每组数据的第一行包含2个整数n和m (n <= 100, m <= 10 ),之间用空格隔开;
    接下来的n行,每行m个数,表示n*m的矩形阵地,其中1表示该位置可以安排士兵,0表示该地形不允许安排士兵。
     
    Output
    请为每组数据计算并输出最多能安排的士兵数量,每组数据输出一行。
     
    Sample Input
    6 6
    0 0 0 0 0 0
    0 0 0 0 0 0
    0 0 1 1 0 0
    0 0 0 0 0 0
    0 0 0 0 0 0
    0 0 0 0 0 0
     
    Sample Output
    2
     
    Source
     
      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<cstdlib>
      5 using namespace std;
      6 
      7 int state[170],Num[170],len;
      8 int a[102];
      9 int befor[170][170],now[170][170];
     10 void Init()
     11 {
     12     int i,k=1<<10;
     13     int ans,x;
     14     len=0;
     15     for(i=0;i<k;i++)
     16     {
     17         if( (i&(i<<2)) || (i&(i>>2)) );
     18         else{
     19             state[len]=i;
     20             x=i;
     21             ans=0;
     22             while(x)
     23             {
     24                 ans++;
     25                 x=(x-1)&x;
     26             }
     27             Num[len++]=ans;
     28         }
     29     }
     30 }
     31 void make_Init(int n,int m)
     32 {
     33     int i,j,k=1<<m;
     34     int hxl;
     35     memset(befor,0,sizeof(befor));
     36     memset(now,0,sizeof(now));
     37     if(n==1)
     38     {
     39         hxl=0;
     40         for(i=0;i<len&&state[i]<k;i++)
     41         {
     42             if( (state[i]&a[1])==state[i] )
     43                 if(hxl<Num[i])
     44                 hxl=Num[i];
     45         }
     46         printf("%d
    ",hxl);
     47         return;
     48     }
     49     for(i=0,hxl=0;i<len&&state[i]<k;i++)
     50     {
     51         if( (state[i]&a[2])!=state[i] ) continue;
     52         for(j=0,hxl=0;j<len&&state[j]<k;j++)
     53         {
     54             if( (state[j]&a[1])!=state[j] ) continue;
     55             if( ((state[i]<<1)&state[j]) || ((state[i]>>1)&state[j]) ) continue;
     56             befor[i][j]=Num[i]+Num[j];
     57             if(hxl<befor[i][j])
     58                 hxl=befor[i][j];
     59         }
     60     }
     61     if(n==2)
     62     {
     63         printf("%d
    ",hxl);
     64     }
     65 }
     66 void solve(int n,int m)
     67 {
     68     int i,j,k=1<<m;
     69     int t,s,hxl;
     70     make_Init(n,m);
     71     if(n==1||n==2) return;
     72     for(i=3;i<=n;i++)
     73     {
     74         for(j=0;j<len&&state[j]<k;j++)
     75         {
     76             if((state[j]&a[i])==state[j])
     77             for(s=0;s<len&&state[s]<k;s++)
     78             {
     79                 if((state[s]&a[i-1])!=state[s]) continue;
     80                 if( ((state[j]<<1)&state[s]) || ((state[j]>>1)&state[s]) ) continue;
     81                 hxl=0;
     82                 for(t=0;t<len&&state[t]<k;t++)
     83                 {
     84                     if( (state[t]&a[i-2])!=state[t] ) continue;
     85                     if( (state[j]&state[t]) || ((state[s]<<1)&state[t]) || ((state[s]>>1)&state[t]) ) continue;
     86                     if(hxl<befor[s][t])
     87                         hxl=befor[s][t];
     88                 }
     89                 now[j][s]=hxl+Num[j];
     90             }
     91         }
     92         for(j=0;j<len&&state[j]<k;j++)
     93         for(s=0;s<len&&state[s]<k;s++)
     94         {
     95             befor[j][s]=now[j][s];
     96             now[j][s]=0;
     97         }
     98     }
     99     hxl=0;
    100     for(j=0;j<len&&state[j]<k;j++)
    101     for(s=0;s<len&&state[s]<k;s++)
    102     if( hxl< befor[j][s] )
    103         hxl=befor[j][s];
    104     printf("%d
    ",hxl);
    105 }
    106 int main()
    107 {
    108     int n,m;
    109     int i,j,x;
    110     Init();
    111     while(scanf("%d%d",&n,&m)>0)
    112     {
    113         for(i=1;i<=n;i++)
    114         {
    115             a[i]=0;
    116             for(j=1;j<=m;j++)
    117             {
    118                 scanf("%d",&x);
    119                 a[i]=a[i]<<1;
    120                 a[i]+=x;
    121             }
    122         }
    123         solve(n,m);
    124     }
    125     return 0;
    126 }
     
  • 相关阅读:
    CSP-201512
    SCC-Tarjan
    CSP-201509
    Codeforces Round #612 (Div. 2)/A/B/C/D
    CF-Hello 2020/A/B/C
    Anaconda介绍、安装及使用教程
    Linux 新手应该知道的 26 个命令
    Python编码规范:IF中的多行条件
    Python assert 断言函数
    数据结构常见的八大排序算法(详细整理)
  • 原文地址:https://www.cnblogs.com/tom987690183/p/3444558.html
Copyright © 2020-2023  润新知