zoukankan      html  css  js  c++  java
  • hdu254 DFS+BFS

     这个题目需要注意以下几点:

         1)注意界线问题,箱子和人不可以越界。

         2)需要判断人是否可以到达人推箱子的指定位置。

         3)不可以用箱子作为标记,因为箱子可以走原来走过的地方,我们用箱子和人推箱子的方向来进行重判。定义一个Hash[8][8][8][8]来标记。

    #define _CRT_SECURE_NO_DEPRECATE
    #include<iostream>
    #include<stack>
    #include<queue>
    using namespace std;
    #define MAX_SIZE 8
    bool Hash[MAX_SIZE][MAX_SIZE][MAX_SIZE][MAX_SIZE];
    bool visit[MAX_SIZE][MAX_SIZE];
    int map[MAX_SIZE][MAX_SIZE];
    int dir[4][2] = { {0,1},{0,-1},{-1,0},{1,0} };
    int N,M;
    struct Point {
    	int x, y;
    	bool operator==(const Point&b)const {
    		return x == b.x&&y == b.y;
    	}
    	bool Isleg() {
    		if (x<1 || x>N || y<1 || y>M || map[x][y] == 1)
    			return false;
    		return true;
    	}
    };
    struct BOX {
    	Point person;
    	Point box;
    	int step;
    };
    int BFS();
    int main() {
    	int i, j,T,res;
    	scanf("%d",&T);
    	while (T--) {
    		scanf("%d%d", &N, &M);
    		for (i = 1; i <= N; i++)
    			for (j = 1; j <= M; j++)
    				scanf("%d", &map[i][j]);
    		res = BFS();
    		printf("%d
    ", res);
    	}
    	return 0;
    }
    bool DFS(Point &person, Point &des,Point &box) {      //判断人是否可以到达指定位置
    	int k;
    	memset(visit, 0, MAX_SIZE*sizeof(visit[0]));
    	visit[person.x][person.y] = 1;
    	stack<Point> S;
    	S.push(person);
    	Point next, pos;
    	while (!S.empty()) {
    		pos = S.top();
    		S.pop();
    		if (pos == des)
    			return true;
    		for (k = 0; k < 4; k++) {
    			next = pos;
    			next.x += dir[k][0];
    			next.y += dir[k][1];
    			if (next.Isleg() && !(next==box) && !visit[next.x][next.y]) {
    				visit[next.x][next.y] = 1;
    				S.push(next);
    			}
    		}
    	}
    	return false;
    }
    Point serch(int x) {
    	Point res;
    	int i, j;
    	for (i = 1; i <= N; i++) {
    		for (j = 1; j <= M; j++)
    			if (x == map[i][j]) {
    				res.x = i;
    				res.y = j;
    			}
    	}
    	return res;
    }
    int BFS() {
    	int i, j,k,l;
    	for (i = 1; i < MAX_SIZE; i++)
    	for (j = 1; j < MAX_SIZE; j++)
    	for (k = 1; k < MAX_SIZE; k++)
    	for (l = 1; l < MAX_SIZE; l++)
    		Hash[i][j][l][k] = 0;
    	BOX B,Box;
    	B.person = serch(4);
    	B.box = serch(2);
    	B.step = 0;
    	Point des, next,peo;
    	des = serch(3);
    	queue<BOX> Q;
    	Q.push(B);
    	while (!Q.empty()) {
    		B = Q.front();
    		Q.pop();
    		if (B.box == des)
    			return B.step;
    		B.step++;
    		Box = B;
    		for (k = 0; k < 4; k++) {
    			next = peo=B.box;
    			next.x += dir[k][0];
    			next.y += dir[k][1];
    			peo.x -= dir[k][0];
    			peo.y -= dir[k][1];
    			if (peo.Isleg() && next.Isleg() &&DFS(B.person,peo,B.box)&&!Hash[peo.x][peo.y][next.x][next.y]) {
    				Hash[peo.x][peo.y][next.x][next.y] = 1;
    				Box.person = B.box;
    				Box.box = next;
    				Q.push(Box);
    			}
    		}
    	}
    	return -1;
    }
    

      

  • 相关阅读:
    js 保留两位小数 input要求是数字框,
    ionic实现滑动的三种方式
    如何在只封装异步请求的两个接口中实现同步请求
    ng-trim
    ng-repeat
    angular.js开发 将多页面开发成单页面
    接口
    记忆
    心情
    最小化安装CentOS-7-x86_64-Minimal-1511图文教程
  • 原文地址:https://www.cnblogs.com/td15980891505/p/5343554.html
Copyright © 2011-2022 走看看