首页 > 代码库 > searchhd1010
searchhd1010
The maze was a rectangle with sizes N by M. There was a door in the maze. At the beginning, the door was closed and it would open at the T-th second for a short period of time (less than 1 second). Therefore the doggie had to arrive at the door on exactly the T-th second. In every second, he could move one block to one of the upper, lower, left and right neighboring blocks. Once he entered a block, the ground of this block would start to sink and disappear in the next second. He could not stay at one block for more than one second, nor could he move into a visited block. Can the poor doggie survive? Please help him.
和骑士走棋盘一样,四方向map加DFS
#include <stdio.h>#include <iostream>#include <string.h>#include <stdlib.h> using namespace std; //迷宫地图//X: 墙壁,小狗不能进入//S: 小狗所处的位置//D: 迷宫的门//. : 空的方格char map[9][9];int n,m,t,di,dj; //(di,dj):门的位置bool escape;int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}}; //分别表示下、上、左、右四个方向 void dfs(int si,int sj,int cnt) //表示起始位置为(si,sj),要求在第cnt秒达到门的位置{ int i,temp; if( si>n || sj>m || si<=0 || sj<=0 ) return; if( si==di && sj==dj && cnt==t ) { escape = 1; return; } //abs(x-ex) + abs(y - ey)表示现在所在的格子到目标格子的距离(不能走对角线) //t-cnt是实际还需要的步数,将他们做差 //如果temp < 0或者temp为奇数,那就不可能到达! temp = (t-cnt) - abs(si-di) - abs(sj-dj); if( temp<0 || temp&1 ) return; for( i=0; i<4; i++ ) { if( map[ si+dir[i][0] ][ sj+dir[i][1] ] != ‘X‘) { map[ si+dir[i][0] ][ sj+dir[i][1] ] = ‘X‘; dfs(si+dir[i][0], sj+dir[i][1], cnt+1); if(escape) return; map[ si+dir[i][0] ][ sj+dir[i][1] ] = ‘.‘; } } return;} int main(){ int i,j,si,sj; while( cin >> n >> m >> t) { if( n==0 && m==0 && t==0 ) break; int wall = 0; for( i=1; i<=n; i++ ) for( j=1; j<=m; j++ ) { cin >> map[i][j]; if(map[i][j]==‘S‘) { si=i; sj=j; } else if( map[i][j]==‘D‘ ) { di=i; dj=j; } else if( map[i][j]==‘X‘ ) wall++; } if( n*m-wall <= t ) { cout << "NO" << endl; continue; } escape = 0; map[si][sj] = ‘X‘; dfs( si, sj, 0 ); if( escape ) cout << "YES" << endl; else cout << "NO" << endl; } return 0;}
searchhd1010
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。