HDU 1240
1 #include<iostream> 2 #include<cstdlib> 3 #include<cstdio> 4 #include<cstring> 5 int mmin,n; 6 using namespace std; 7 const int qq=11; 8 char map[qq][qq][qq]; 9 int dx[]={0,0,-1,1,0,0},dy[]={-1,1,0,0,0,0},dz[]={0,0,0,0,1,-1}; 10 int tx,ty,tz; 11 void dfs(int sz,int sy,int sx,int cnt) 12 { 13 if(cnt>=mmin) return; 14 if(sx<0||sy<0||sz<0||sx>=n||sy>=n||sz>=n) return; 15 if(sz==tz&&sy==ty&&sx==tx){ 16 if(cnt<mmin) mmin=cnt; 17 return; 18 } 19 for(int i=0;i<6;++i){ 20 if(map[sz+dz[i]][sy+dy[i]][sx+dx[i]]!='X'){ 21 map[sz+dz[i]][sy+dy[i]][sx+dx[i]]='X'; 22 dfs(sz+dz[i],sy+dy[i],sx+dx[i],cnt+1); 23 map[sz+dz[i]][sy+dy[i]][sx+dx[i]]='O'; 24 } 25 } 26 return; 27 } 28 int main() 29 { 30 char s[15]; 31 while(scanf("%s %d%*c",s,&n)!=EOF){ 32 mmin=1e6; 33 for(int x,y,z=0;z<n;++z) 34 for(y=0;y<n;++y){ 35 for(x=0;x<n;++x){ 36 map[z][y][x]=getchar(); 37 } 38 getchar(); 39 } 40 int sx,sy,sz; 41 scanf("%d %d %d",&sx,&sy,&sz); 42 scanf("%d %d %d",&tx,&ty,&tz);scanf("%s",s); 43 map[sz][sy][sx]='X'; 44 dfs(sz,sy,sx,0); 45 if(mmin==1e6) printf("NO ROUTE\n"); 46 else printf("%d %d\n",n,mmin); 47 } 48 }
搜索第二题
这是我模仿1010写出来的一段代码,说到底也剪枝了吧... 虽然没什么乱用
上面代码测试到第三组数据就超时了. 主要原因是首先要找到一个解才能起到一个剪枝的效果,如果一开始找到的就是那个最大的解的话,这剪枝也没什么效果了
所以参考了别人的代码 下面的剪枝效果就比较好了,记录出发点到每一点的最小步数.但是先要标记一下
1 #include<iostream> 2 #include<cstdlib> 3 #include<cstdio> 4 #include<cstring> 5 int mmin,n; 6 const int MIN=1e7; 7 using namespace std; 8 const int qq=11; 9 char map[qq][qq][qq]; 10 int dis[qq][qq][qq]; 11 int dx[]={0,0,-1,1,0,0},dy[]={-1,1,0,0,0,0},dz[]={0,0,0,0,1,-1}; 12 int tx,ty,tz; 13 void dfs(int sz,int sy,int sx,int cnt) 14 { 15 if(map[sz][sy][sx]=='X') return; 16 if(sx<0||sy<0||sz<0||sx>=n||sy>=n||sz>=n) return; 17 if(sz==tz&&sy==ty&&sx==tx){ 18 if(cnt<mmin) mmin=cnt; 19 return; 20 } 21 if(dis[sz][sy][sx]<=cnt) return; 22 else dis[sz][sy][sx]=cnt; 23 int dxx,dyy,dzz; 24 for(int i=0;i<6;++i){ 25 dxx=sx+dx[i];dyy=sy+dy[i];dzz=sz+dz[i]; 26 dfs(dzz,dyy,dxx,cnt+1); 27 } 28 return; 29 } 30 int main() 31 { 32 char s[15]; 33 while(scanf("%s %d%*c",s,&n)!=EOF){ 34 mmin=1e8; 35 for(int x,y,z=0;z<n;++z) 36 for(y=0;y<n;++y){ 37 for(x=0;x<n;++x){ 38 map[z][y][x]=getchar(); 39 dis[z][y][x]=MIN; 40 } 41 getchar(); 42 } 43 int sx,sy,sz; 44 scanf("%d %d %d",&sx,&sy,&sz); 45 scanf("%d %d %d",&tx,&ty,&tz); 46 scanf("%s",s); 47 dfs(sz,sy,sx,0); 48 if(mmin==1e8) printf("NO ROUTE\n"); 49 else printf("%d %d\n",n,mmin); 50 } 51 }
继续出发!!!搜索