【DFS】FOJ 1046 Tempter of the Bone

这个题目主要是深度优先搜索的思想。

要注意回溯和跳出条件

 

#include <stdio.h> #define MAXSIZE 20 bool flag; void DFS(int Maze[][MAXSIZE+2], int x, int y, int step, int t, int DisX, int DisY) { int plusX[] = {0,1,0,-1}; int plusY[] = {1,0,-1,0}; int i; if (x == DisX&&y == DisY&&step == t) flag = true; //跳出条件 if (flag) return; if (step >= t) return; for (i=0;i<4;i++) { Maze[x][y] = -1; if (Maze[x+plusX[i]][y+plusY[i]] == 0) DFS(Maze, x+plusX[i], y+plusY[i], step+1, t, DisX, DisY); //回溯 Maze[x][y] = 0; } } int main() { int m,n,t; int i,j; int Maze[MAXSIZE+2][MAXSIZE+2]; char line[MAXSIZE+1]; int PosX,PosY,DisX,DisY; while (scanf("%d%d%d", &m, &n, &t)!=EOF,m!=0) { flag = false; for (i=0;i<=m+1;i++) { Maze[i][0] = -1;Maze[i][n+1] = -1; } for (i=0;i<=n+1;i++) { Maze[0][i] = -1;Maze[m+1][i] = -1; } for (i=1;i<=m;i++) { scanf("%s", line); for (j=1;j<=n;j++) { if (line[j-1] == '.') Maze[i][j] = 0; else if (line[j-1] == 'X') Maze[i][j] = -1; else if (line[j-1] == 'S') { PosX = i;PosY = j;Maze[i][j] = 0; } else if (line[j-1] == 'D') { Maze[i][j] = 0;DisX = i;DisY = j; } } } DFS(Maze, PosX, PosY, 0, t, DisX, DisY); if (flag) printf("YES/n"); else printf("NO/n"); } return 0; }

你可能感兴趣的:(【DFS】FOJ 1046 Tempter of the Bone)