• 哈理工oj 1345chess解题报告


    链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1345

    这道题很明显是一道广搜题,但是搜索的时候相当的麻烦啊,八千多b的代码量,每一行都超长,也确实是自己优化的不够,不过有思路就做了也没想过那么多,只求ac其实很多时候代码长分类仔细速度反而会加快

    View Code
      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<queue>
      5 using namespace std;
      6 bool f[11][11][11][11][11][11];//状态标记
      7 int dir[8][2]={{2,-1},{2,1},{-2,1},{-2,-1},{-1,2},{1,2},{-1,-2},{1,-2}};
      8 int dir2[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//蹩马腿的方向
      9 char s[15][15];
     10 int n,m;
     11 int min(int a,int b)
     12 {
     13     return a<b?a:b;
     14 }
     15 int max(int a,int b)
     16 {
     17     return a>b?a:b;
     18 }
     19 struct state
     20 {
     21     int ci,cj;
     22     int pi,pj;
     23     int mi,mj;
     24     int step;
     25     state(int ci1,int cj1,int pi1,int pj1,int mi1,int mj1,int step1)//构造函数
     26     {
     27         ci=ci1;
     28         cj=cj1;
     29         pi=pi1;
     30         pj=pj1;
     31         mi=mi1;
     32         mj=mj1;
     33         step=step1;
     34     }
     35 };
     36 bool used(state s1)
     37 {
     38     return f[s1.ci][s1.cj][s1.pi][s1.pj][s1.mi][s1.mj];
     39 }
     40 bool canatack(state s1,int i,int j)
     41 {
     42     int k;
     43     if(s1.ci==i)
     44     {
     45         int sum=0;
     46         for(k=min(s1.cj,j)+1;k<max(s1.cj,j);k++)
     47         {
     48             if(s[i][k]=='D'||(s1.pi==i&&s1.pj==k)||(s1.mi==i&&s1.mj==k))
     49             {
     50                 sum++;
     51                 break;
     52             }
     53         }
     54         if(!sum)
     55         return true;
     56     }
     57     if(s1.cj==j)
     58     {
     59         int sum=0;
     60         for(k=min(s1.ci,i)+1;k<max(s1.ci,i);k++)
     61         {
     62             if(s[k][j]=='D'||(s1.pi==k&&s1.pj==j)||(s1.mi==k&&s1.mj==j))
     63             {
     64                 sum++;
     65                 break;
     66             }
     67         }
     68         if(!sum)
     69         return true;
     70     }
     71     for(k=0;k<8;k++)
     72     {
     73         int tempi=s1.mi+dir2[k>>1][0];
     74         int tempj=s1.mj+dir2[k>>1][1];
     75         if(tempi<n&&tempj<m&&tempi>=0&&tempj>=0&&s[tempi][tempj]!='D'&&(s1.ci!=tempi||s1.cj!=tempj)&&(s1.pi!=tempi||s1.pj!=tempj)&&s1.mi+dir[k][0]==i&&s1.mj+dir[k][1]==j)
     76         return true;
     77     }
     78     if(s1.pi==i)
     79     {
     80         int sum=0;
     81         for(k=min(s1.pj,j)+1;k<max(s1.pj,j);k++)
     82         {
     83             if(s[i][k]=='D'||(s1.ci==i&&s1.cj==k)||(s1.mi==i&&s1.mj==k))
     84             sum++;
     85         }
     86         if(sum==1)
     87         return true;
     88     }
     89     if(s1.pj==j)
     90     {
     91         int sum=0;
     92         for(k=min(s1.pi,i)+1;k<max(s1.pi,i);k++)
     93         {
     94             if(s[k][j]=='D'||(s1.ci==k&&s1.cj==j)||(s1.mi==k&&s1.mj==j))
     95             sum++;
     96         }
     97         if(sum==1)
     98         return true;
     99     }
    100     return false;
    101 }
    102 queue<state> q;
    103 int main()
    104 {
    105     int i,j,k;
    106     int cio,cjo,pio,pjo,mio,mjo,si,sj;
    107     int icase=1;
    108     while(scanf("%d%d",&n,&m)!=EOF)
    109     {
    110         while(!q.empty())
    111         q.pop();
    112         bool p=false;
    113         memset(f,0,sizeof(f));
    114         for(i=0;i<n;i++)
    115         scanf("%s",s[i]);
    116         printf("Scenario #%d\n",icase++);
    117         for(i=0;i<n;i++)
    118         for(j=0;j<m;j++)
    119         {
    120             if(s[i][j]=='C')
    121             {
    122                 cio=i;
    123                 cjo=j;
    124                 continue;
    125             }
    126             if(s[i][j]=='P')
    127             {
    128                 pio=i;
    129                 pjo=j;
    130                 continue;
    131             }
    132             if(s[i][j]=='M')
    133             {
    134                 mio=i;
    135                 mjo=j;
    136                 continue;
    137             }
    138             if(s[i][j]=='S')
    139             {
    140                 si=i;
    141                 sj=j;
    142                 continue;
    143             }
    144         }
    145         state ss(cio,cjo,pio,pjo,mio,mjo,0);
    146         f[cio][cjo][pio][pjo][mio][mjo]=true;
    147         q.push(ss);
    148         while(!q.empty())
    149         {
    150             state temp=q.front();
    151             q.pop();
    152             //printf("%d %d %d %d %d %d\n",temp.ci,temp.cj,temp.pi,temp.pj,temp.mi,temp.mj);
    153             if(canatack(temp,si,sj))
    154             {
    155                 printf("%d\n\n",temp.step+1);
    156                 p=true;
    157                 break;
    158             }
    159             for(i=temp.ci-1;i>=0;i--)
    160             {
    161                 if(s[i][temp.cj]=='D'||s[i][temp.cj]=='S'||(temp.pi==i&&temp.pj==temp.cj)||(temp.mi==i&&temp.mj==temp.cj))
    162                 break;
    163                 state temp2(i,temp.cj,temp.pi,temp.pj,temp.mi,temp.mj,temp.step+1);
    164                 if(!used(temp2))
    165                 {
    166                     f[temp2.ci][temp2.cj][temp2.pi][temp2.pj][temp2.mi][temp2.mj]=true;
    167                     q.push(temp2);
    168                 }
    169             }
    170             for(i=temp.ci+1;i<n;i++)
    171             {
    172                 if(s[i][temp.cj]=='D'||s[i][temp.cj]=='S'||(temp.pi==i&&temp.pj==temp.cj)||(temp.mi==i&&temp.mj==temp.cj))
    173                 break;
    174                 state temp2(i,temp.cj,temp.pi,temp.pj,temp.mi,temp.mj,temp.step+1);
    175                 if(!used(temp2))
    176                 {
    177                     f[temp2.ci][temp2.cj][temp2.pi][temp2.pj][temp2.mi][temp2.mj]=true;
    178                     q.push(temp2);
    179                 }
    180             }
    181             for(j=temp.cj-1;j>=0;j--)
    182             {
    183                 if(s[temp.ci][j]=='D'||s[temp.ci][j]=='S'||(temp.pi==temp.ci&&temp.pj==j)||(temp.mi==temp.ci&&temp.mj==j))
    184                 break;
    185                 state temp2(temp.ci,j,temp.pi,temp.pj,temp.mi,temp.mj,temp.step+1);
    186                 if(!used(temp2))
    187                 {
    188                     f[temp2.ci][temp2.cj][temp2.pi][temp2.pj][temp2.mi][temp2.mj]=true;
    189                     q.push(temp2);
    190                 }
    191             }
    192             for(j=temp.cj+1;j<m;j++)
    193             {
    194                 if(s[temp.ci][j]=='D'||s[temp.ci][j]=='S'||(temp.pi==temp.ci&&temp.pj==j)||(temp.mi==temp.ci&&temp.mj==j))
    195                 break;
    196                 state temp2(temp.ci,j,temp.pi,temp.pj,temp.mi,temp.mj,temp.step+1);
    197                 if(!used(temp2))
    198                 {
    199                     f[temp2.ci][temp2.cj][temp2.pi][temp2.pj][temp2.mi][temp2.mj]=true;
    200                     q.push(temp2);
    201                 }
    202             }
    203             for(i=temp.pi-1;i>=0;i--)
    204             {
    205                 if(s[i][temp.pj]=='D'||s[i][temp.pj]=='S'||(temp.ci==i&&temp.pj==temp.cj)||(temp.mi==i&&temp.mj==temp.pj))
    206                 break;
    207                 state temp2(temp.ci,temp.cj,i,temp.pj,temp.mi,temp.mj,temp.step+1);
    208                 if(!used(temp2))
    209                 {
    210                     f[temp2.ci][temp2.cj][temp2.pi][temp2.pj][temp2.mi][temp2.mj]=true;
    211                     q.push(temp2);
    212                 }
    213             }
    214             for(i=temp.pi+1;i<n;i++)
    215             {
    216                 if(s[i][temp.pj]=='D'||s[i][temp.pj]=='S'||(temp.ci==i&&temp.pj==temp.cj)||(temp.mi==i&&temp.mj==temp.pj))
    217                 break;
    218                 state temp2(temp.ci,temp.cj,i,temp.pj,temp.mi,temp.mj,temp.step+1);
    219                 if(!used(temp2))
    220                 {
    221                     f[temp2.ci][temp2.cj][temp2.pi][temp2.pj][temp2.mi][temp2.mj]=true;
    222                     q.push(temp2);
    223                 }
    224             }
    225             for(j=temp.pj-1;j>=0;j--)
    226             {
    227                 if(s[temp.pi][j]=='D'||s[temp.pi][j]=='S'||(temp.pi==temp.ci&&temp.cj==j)||(temp.mi==temp.pi&&temp.mj==j))
    228                 break;
    229                 state temp2(temp.ci,temp.cj,temp.pi,j,temp.mi,temp.mj,temp.step+1);
    230                 if(!used(temp2))
    231                 {
    232                     f[temp2.ci][temp2.cj][temp2.pi][temp2.pj][temp2.mi][temp2.mj]=true;
    233                     q.push(temp2);
    234                 }
    235             }
    236             for(j=temp.pj+1;j<m;j++)
    237             {
    238                 if(s[temp.pi][j]=='D'||s[temp.pi][j]=='S'||(temp.pi==temp.ci&&temp.cj==j)||(temp.mi==temp.pi&&temp.mj==j))
    239                 break;
    240                 state temp2(temp.ci,temp.cj,temp.pi,j,temp.mi,temp.mj,temp.step+1);
    241                 if(!used(temp2))
    242                 {
    243                     f[temp2.ci][temp2.cj][temp2.pi][temp2.pj][temp2.mi][temp2.mj]=true;
    244                     q.push(temp2);
    245                 }
    246             }
    247             for(i=0;i<8;i++)
    248             {
    249                 int ti=temp.mi+dir2[i>>1][0];
    250                 int tj=temp.mj+dir2[i>>1][1];
    251                 if(ti>=0&&ti<n&&tj>=0&&tj<m&&s[ti][tj]!='D'&&s[ti][tj]!='S'&&(temp.ci!=ti||temp.cj!=tj)&&(temp.pi!=ti||temp.pj!=tj))
    252                 {
    253                     ti=temp.mi+dir[i][0];
    254                     tj=temp.mj+dir[i][1];
    255                     if(ti>=0&&ti<n&&tj>=0&&tj<m&&s[ti][tj]!='D'&&s[ti][tj]!='S'&&(temp.ci!=ti||temp.cj!=tj)&&(temp.pi!=ti||temp.pj!=tj))
    256                     {state temp2(temp.ci,temp.cj,temp.pi,temp.pj,temp.mi+dir[i][0],temp.mj+dir[i][1],temp.step+1);
    257                     if(!used(temp2))
    258                     {
    259                         f[temp2.ci][temp2.cj][temp2.pi][temp2.pj][temp2.mi][temp2.mj]=true;
    260                         q.push(temp2);
    261                     }
    262                     }
    263                 }
    264             }
    265         }
    266         if(!p)
    267         printf("OH!That's impossible!\n\n");
    268     }
    269     return 0;
    270 }
  • 相关阅读:
    Pascal 语言中的关键字及保留字
    单元文件结构
    在 case 语句中使用字符串-转
    程序流程的辅助控制-转
    XE版本 InputQuery 可以同时填多个输入值
    转:Delphi 6 实用函数
    转:Delphi 函数大全
    d 属性: 赋予字段执行动作的能力
    Json格式示意图
    转:虚拟方法跳过父类继承调用祖父类的代码 --值得试一试
  • 原文地址:https://www.cnblogs.com/caozhenhai/p/2460597.html
Copyright © 2020-2023  润新知