标签:
Description
Input
Output
Sample Input
3 6 5 NEESWE WWWESS SNWWWW 4 5 1 SESWE EESNW NWEEN EWSEN 0 0 0
Sample Output
10 step(s) to exit 3 step(s) before a loop of 8 step(s)
看懂题目就好其实不难。
题目大意就是:给出r行c列, 然后从第一行的第i个位置开始走 每个位置有标记E W S N, 分别表示向东, 向西, 向南, 向北 然后, 有两种情况, 一种能走出去, 一种是陷入死循环。要求输出结果!
解法一:(直接模拟)
#include<stdio.h> char str[100][100]; int main() { int r, c, in; while(scanf("%d %d %d", &r, &c, &in) != EOF) { if(r == 0 && c ==0 && in == 0) break; getchar(); for(int i = 0; i < r; i++) gets(str[i]); int tr, tc, loop; int step = 0; int mark = 1; tr = 0; tc = in-1; while(1) { if(str[tr][tc] == ‘E‘) { step++; str[tr][tc] = step + ‘0‘; if(tc == c-1) break; else tc = tc + 1; } else if(str[tr][tc] == ‘W‘) { step++; str[tr][tc] = step + ‘0‘; if(tc == 0) break; else tc = tc - 1; } else if(str[tr][tc] == ‘S‘) { step++; str[tr][tc] = step + ‘0‘; if(tr == r-1) break; else tr = tr + 1; } else if(str[tr][tc] == ‘N‘) { step++; str[tr][tc] = step + ‘0‘; if(tr == 0) break; else tr = tr - 1; } else { mark = 0; loop = str[tr][tc] - ‘0‘ - 1; printf("%d step(s) before a loop of %d step(s)\n", loop, step - loop); break; } } if(mark == 1) printf("%d step(s) to exit\n", step); } return 0; }
解法二:(DFS)
#include<stdio.h> #include<stdlib.h> #include<string.h> char map[15][15] ; //用来记录图形 int des[15][15] ; //用来记录该点所走的步数,以及判断是否构成循环 int a ,b , l , count , f , h;//a,b记录输入的行列数,count记录循环频数,h,循环前的步数 void DFS( int m , int n , int sp ) { if( m <0 || m >= a || n < 0 || n >= b )//判断是否出去 { f = 1 ; count = sp ; return ; } if( des[m][n] )//判断是否循环 { f = 0 ; count = des[m][n]; h = sp - des[m][n] ; return ; } des[m][n] = sp ; //把步数赋给des if( map[m][n] == ‘N‘ ) DFS( m-1 , n , sp+1) ; if( map[m][n] == ‘S‘ ) DFS( m+1 , n , sp+1 ) ; if( map[m][n] == ‘E‘ ) DFS( m , n+1 , sp+1 ) ; if( map[m][n] == ‘W‘ ) DFS( m , n-1 , sp+1 ) ; } int main( ) { while( scanf("%d%d" , &a, &b ) , a || b ) { scanf("%d" , &l ) ; memset( des , 0 , sizeof( des ) ) ; getchar ( ) ; count = 0 ; f = 0 ; h = 0 ; for( int i = 0 ; i < a ; i++ ) { for( int j = 0 ; j < b ; j++ ) scanf("%c" , &map[i][j] ) ; getchar(); } DFS ( 0 ,l-1 , 1 ) ; if( f ) { printf("%d step(s) to exit\n" , count-1 ) ; } else printf("%d step(s) before a loop of %d step(s)\n" ,count-1 ,h ) ; } return 0; }
标签:
原文地址:http://www.cnblogs.com/Asimple/p/5482295.html