哈理工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 }
原文地址:https://www.cnblogs.com/caozhenhai/p/2460597.html