HDU 1312 Red and Black
可重复路径搜索,不需要回溯
这应该也属于很简单很经典的DFS题目
和前面的小狗闯迷宫的题目(HDU 1010 Tempter of the Bone)对比,只能走一条路的题目,是需要回溯的。
原因很简单,寻路失败就需要把迷宫恢复成搜索前的状态
吐槽一下我的失误,一看到矩阵我就以为第一个数代表行数,第二个数代表列数
所以读题要仔细,认真审题!
1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 using namespace std; 6 7 int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; 8 char map[23][23]; 9 int m, n, Sx, Sy, cnt; 10 11 void DFS(int x, int y) 12 { 13 map[x][y] = '#'; 14 for(int i = 0; i < 4; ++i) 15 { 16 int xx = x + dir[i][0]; 17 int yy = y + dir[i][1]; 18 if(xx>=0 && xx<m && yy>=0 && yy<n 19 && map[xx][yy] == '.') 20 { 21 ++cnt; 22 map[xx][yy] = '#'; 23 DFS(xx, yy); 24 } 25 } 26 } 27 28 int main(void) 29 { 30 #ifdef LOCAL 31 freopen("1312in.txt", "r", stdin); 32 #endif 33 34 while(scanf("%d%d", &n, &m) == 2) 35 { 36 if(m == 0 && n == 0) 37 break; 38 int i, j; 39 getchar(); 40 for(i = 0; i < m; ++i) 41 { 42 for(j = 0; j < n; ++j) 43 { 44 scanf("%c", &map[i][j]); 45 if(map[i][j] == '@') 46 { 47 Sx = i; 48 Sy = j; 49 } 50 } 51 getchar(); 52 } 53 map[Sx][Sy] = '#'; 54 cnt = 1; 55 DFS(Sx, Sy); 56 printf("%d\n", cnt); 57 } 58 return 0; 59 }