链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1345
这道题很明显是一道广搜题,但是搜索的时候相当的麻烦啊,八千多b的代码量,每一行都超长,也确实是自己优化的不够,不过有思路就做了也没想过那么多,只求ac其实很多时候代码长分类仔细速度反而会加快

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 }