『一本通』广搜的优化技巧
打开灯泡
1 #include<bits/stdc++.h> 2 #define N 500+5 3 using namespace std; 4 int n,m,dis[N][N]; 5 char a[N][N]; 6 struct node{int X,Y;}; 7 deque<node>q; 8 9 void Do(int x,int y,int s,int k) { 10 if(dis[x][y]>s+k) { 11 dis[x][y]=s+k; 12 if(!k) q.push_front((node){x,y}); 13 else q.push_back((node){x,y}); 14 } 15 } 16 17 void BFS() { 18 memset(dis,0x7f,sizeof(dis)); 19 q.push_front((node){1,1}); dis[1][1]=0; 20 while(!q.empty()) { 21 int x=q.front().X,y=q.front().Y; 22 q.pop_front(); 23 if(x>1&&y>1) Do(x-1,y-1,dis[x][y],a[x-1][y-1]!='\\'); 24 if(x>1&&y<=m) Do(x-1,y+1,dis[x][y],a[x-1][y]!='/'); 25 if(x<=n&&y<=m) Do(x+1,y+1,dis[x][y],a[x][y]!='\\'); 26 if(x<=n&&y>1) Do(x+1,y-1,dis[x][y],a[x][y-1]!='/'); 27 } 28 printf("%d",dis[n+1][m+1]); 29 } 30 31 int main() { 32 scanf("%d%d",&n,&m); 33 if((n+m)%2) return printf("NO SOLUTION"),0; 34 for(int i=1;i<=n;i++) scanf("%s",a[i]+1); 35 BFS(); //Breadth-First Search(广度优先搜索) 36 }
魔板
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=5e4+5,M=165e5; 4 const int g[3][9]={{0,8,7,6,5,4,3,2,1},{0,4,1,2,3,6,7,8,5},{0,1,7,2,4,5,3,6,8}}; 5 int h,t=1,e,now,a[9],b[N][9],c[N][2]; 6 char s[N]; 7 bool vis[M]; 8 9 int main() { 10 int x,top; 11 for(int i=1;i<=8;i++) scanf("%d",&x),e=(e<<3)+x-1; //Hash 12 for(int i=1;i<=8;i++) now=(now<<3)+(b[1][i]=i-1); 13 if(now==e) return puts("0"),0; 14 vis[now]=1; 15 while((h++)<t) 16 for(int i=0;i<3;i++) { 17 now=0; 18 for(int j=1;j<=8;j++) now=(now<<3)+(a[j]=b[h][g[i][j]]); 19 if(vis[now]) continue; 20 vis[now]=1; 21 b[++t][0]=b[h][0]+1; 22 for(int j=1;j<=8;j++) b[t][j]=a[j]; 23 c[t][0]=h,c[t][1]=i+'A'; 24 if(now==e) { 25 printf("%d\n",b[t][0]); 26 x=t,top=0; 27 while(c[x][0]) s[++top]=c[x][1],x=c[x][0]; 28 for(int j=top;j>0;j--) putchar(s[j]); 29 return 0; 30 } 31 } 32 }
Knight Moves
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int dx[9]={2,2,1,1,-1,-1,-2,-2},dy[9]={-1,1,-2,2,-2,2,-1,1}; 4 int n,L,step[305][305]; 5 struct node{int x,y;}b,e; 6 queue<node>q; 7 bool check(int x,int y) {return x>=0&&x<L&&y>=0&&y<L;} 8 9 void BFS() { 10 while(!q.empty()) q.pop(); 11 memset(step,0x7f,sizeof(step)); 12 q.push(b),step[b.x][b.y]=0; 13 while(step[e.x][e.y]>1e3) { 14 int X=q.front().x,Y=q.front().y; q.pop(); 15 for(int i=0;i<8;i++) { 16 int nx=X+dx[i],ny=Y+dy[i]; 17 if(!check(nx,ny)||step[nx][ny]<1e3) continue; 18 step[nx][ny]=step[X][Y]+1; 19 q.push((node){nx,ny}); 20 } 21 } 22 printf("%d\n",step[e.x][e.y]); 23 } 24 25 int main() { 26 scanf("%d",&n); 27 while(n--) { 28 scanf("%d%d%d%d%d",&L,&b.x,&b.y,&e.x,&e.y); 29 if(b.x==e.x&&b.y==e.y) puts("0"); 30 else BFS(); //Breadth-First Search(广度优先搜索) 31 } 32 }
如有错误请指正。