zoukankan      html  css  js  c++  java
  • SPOJ LAS(BFS)题解

    题目:VJ

    思路:

    BFS+回溯,但是要剪枝,看了dalao的题解,超时+WA无数发,终于过了


    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<cctype>
    #include<queue>
    #include<cmath>
    //#include<map>
    #include<string>
    #include<iostream>
    #include<algorithm>
    #define INF 0x3f3f3f3f
    const int N=300;
    using namespace std;
    char map[N][N];
    char dir[N][N]; 
    int vis[N][N],fx[N][N],fy[N][N];
    int n,m,sx,sy,ex,ey,to[4][2]={1,0,-1,0,0,1,0,-1};
    char turn[4]={'d','u','r','l'};
    struct node{
    	int x,y;
    	int step;
    	int i; 
    };
    queue<node> q;
    void init(){
    	memset (vis,-1,sizeof(vis));
    	while(!q.empty()) q.pop();
    }
    int judge(int x,int y,int step){
    	if(x>=1 && x<=n && y>=1 && y<=m && map[x][y]!='#' && (vis[x][y]==-1 || vis[x][y]==step)) return 1;
    	return 0;
    }
    void add(int x,int y,int i,int step){
    	node a;
    	x+=to[i][0];
    	y+=to[i][1];
    	while(judge(x,y,step)){
    		if(vis[x][y]!=step){
    			dir[x][y]=turn[i];
    			vis[x][y]=step;
    			fx[x][y]=x-to[i][0];
    			fy[x][y]=y-to[i][1];
    			a.i=i;
    			a.x=x;
    			a.y=y;
    			a.step=step;
    			q.push(a);
    		}
    		x+=to[i][0];
    		y+=to[i][1];
    	}
    }
    void paint(int i){
    	int x,y,tx,ty;
    	tx=fx[ex][ey];
    	ty=fy[ex][ey];
    	x=ex;
    	y=ey;
    	while(tx!=sx || ty!=sy){
    		char wh=dir[tx][ty];
    		char go=dir[x][y];
    		if(wh!=go){
    			if(wh=='u'){
    				if(go=='l'){
    					map[tx][ty]='\';
    				}
    				else if(go=='r'){
    					map[tx][ty]='/';
    				}
    			}
    			else if(wh=='d'){
    				if(go=='r'){
    					map[tx][ty]='\';
    				}
    				else if(go=='l'){
    					map[tx][ty]='/';
    				}
    			}
    			else if(wh=='l'){
    				if(go=='u'){
    					map[tx][ty]='\';
    				}
    				else if(go=='d'){
    					map[tx][ty]='/';
    				}
    			}
    			else if(wh=='r'){
    				if(go=='d'){
    					map[tx][ty]='\';
    				}
    				else if(go=='u'){
    					map[tx][ty]='/';
    				}
    			}
    		}
    		x=tx;
    		y=ty;
    		tx=fx[x][y];
    		ty=fy[x][y];
    	}
    }
    void bfs(int dd){
    	int x,y;
    	init();
    	node a,b;
    	vis[sx][sy]=100000;
    	dir[sx][sy]='o';
    	add(sx,sy,dd,0);
    	while(!q.empty()){
    		a=q.front();
    		q.pop();
    		if(a.x==ex && a.y==ey){
    			paint(a.i);
    			return;
    		}
    		b.step=a.step+1;
    		for(int i=0;i<4;i++){
    			b.x=a.x+to[i][0];
    			b.y=a.y+to[i][1];
    			if(judge(b.x,b.y,b.step)){
    				add(a.x,a.y,i,b.step);
    			}
    		}
    	}
    }
    
    int main(){
    	int t;
    	scanf("%d",&t);
    	while(t--){
    		scanf("%d%d",&n,&m);
    		for(int i=1;i<=n;i++){
    			scanf("%s",map[i]+1);
    			for(int j=1;j<=m;j++){
    				if(map[i][j]=='C'){
    					ex=i;ey=j;
    				}
    				else if(map[i][j]=='<' || map[i][j]=='>' || map[i][j]=='v' || map[i][j]=='^'){
    					sx=i;sy=j;
    				}
    			}
    		}
    		
    		//to[4][2]={1,0,  -1,0,  0,1,  0,-1}
    		int direction;
    		if(map[sx][sy]=='<') direction=3;
    		else if(map[sx][sy]=='>') direction=2;
    		else if(map[sx][sy]=='^') direction=1;
    		else direction=0; 
    		
    		bfs(direction);
    		for(int i=1;i<=n;i++){
    			for(int j=1;j<=m;j++){
    				printf("%c",map[i][j]);
    			}
    			printf("
    ");
    		}
    	}
    	return 0;
    }

  • 相关阅读:
    mac,使用jadx,apktool,反编译apk,打包apk,签名,阅读smali文件
    对安卓逆向的认识
    js逆向答疑
    js-15:js逆向总结
    对js逆向的认识
    开发工具使用技巧-pycharm-mac
    ES6的新特性
    js-BOM操作
    js-DOM操作
    js-ECMAScript-6:自定义对象
  • 原文地址:https://www.cnblogs.com/KirinSB/p/9409126.html
Copyright © 2011-2022 走看看