hdoj1010
起点设为(sx,sy),终点为(dx,dy),理解为一副棋盘,两点间最短路径minstep = abs(sx-dx) + abs(sy-dy)
则 minstep <= T ,
并且 T - minstep 必定为偶数,(-。-;)怎么数学证明呢......
利用这些条件就可以提前判断一些不满足上述条件的用例。
DFS
但是还是WA了,查了好久才看到有人说可能是数据不一定是M*N行的矩阵形式,可能是一行,醉了......只好用cin,cin对于字符变量,会自动跳过换行符,所以就解决了可能有换行的问题。
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<iostream> 4 using namespace std; 5 char maze[7][7] ; 6 int m , n , t , sx , sy , dx , dy , minstep ; 7 8 bool DFS(int sx , int sy , int step) 9 { 10 if(sx == dx && sy == dy && step == 0) 11 { 12 return true ; 13 } 14 if(sx < 0 || sx >= n || sy < 0 || sy >= m || maze[sx][sy] == 'X' || step == -1) 15 { 16 return false ; 17 } 18 maze[sx][sy] = 'X' ; 19 if(DFS(sx-1 , sy , step-1) || DFS(sx+1 , sy , step-1) || DFS(sx , sy-1 , step-1) || DFS(sx , sy+1 , step-1)) 20 { 21 return true ; 22 } 23 maze[sx][sy] = '.' ; 24 return false ; 25 } 26 27 int main() 28 { 29 int i , j , np ; 30 while(scanf("%d %d %d" , &m , &n ,&t) && m && n && t) 31 { 32 np = 0 ; 33 for(i = 0 ; i < n ; ++i) 34 { 35 for(j = 0 ; j < m ; ++j) 36 { 37 cin>>maze[i][j] ; 38 if(maze[i][j] == '.') 39 { 40 ++np ; 41 } 42 else if(maze[i][j] == 'S') 43 { 44 sx = i ; 45 sy = j ; 46 } 47 else if(maze[i][j] == 'D') 48 { 49 dx = i ; 50 dy = j ; 51 } 52 } 53 } 54 minstep = abs(sx-dx) + abs(sy-dy) ; 55 if(minstep > t || (t - minstep)%2 != 0 || t - 1 > np) 56 { 57 printf("NO\n") ; 58 continue ; 59 } 60 if(DFS(sx , sy , t)) 61 printf("YES\n") ; 62 else 63 printf("NO\n") ; 64 65 } 66 return 0 ; 67 }
浙公网安备 33010602011771号