题目大意:
一冰壶在board上运动,会沿着原来的方向一直运动,直到遇到障碍物。此时冰壶停下,障碍物消失,你重新给冰壶指定一个方向,冰壶继续运动,直到达到终点。求你给方向的次数。
要点:
1.运动时碰到障碍物才会停下,如果它周围都是障碍物,就没法运动。
2.题目要求次数必须小于等于10,超过则认为不能到达
代码如下:
1 #include2 #include 3 #include 4 #define max_ans 15 5 int dir[][2] = { { 0,1}, { 0,-1},{-1,0},{ 1,0}}; 6 int w, h; 7 int sx, sy; 8 9 char board[22][22];10 int ans;11 12 13 void dfs(int x, int y, int step) {14 if(step > 10) {15 return;16 }17 if(board[x][y] == 3) {18 if(step < ans) {19 ans = step;20 }21 return;22 }23 for(int i = 0; i < 4; i++) {24 int tpx = x;25 int tpy = y;26 while(tpx >= 0 && tpy >= 0 && tpx < h && tpy < w && (board[tpx][tpy] == 0 || board[tpx][tpy] == 2)) {27 tpx = tpx + dir[i][0];28 tpy = tpy + dir[i][1];29 }30 31 if(tpx >= 0 && tpy >= 0 && tpx < h && tpy < w) {32 if(board[tpx][tpy] == 3) {33 if(step < ans) {34 ans = step;35 }36 continue;37 }38 else {39 int tx = tpx - dir[i][0];40 int ty = tpy - dir[i][1];41 42 if(tx != x || ty != y) {43 if(board[tpx][tpy] == 1) {44 board[tpx][tpy] = 0;45 dfs(tx, ty, step+1);46 board[tpx][tpy] = 1;47 } 48 }49 }50 }51 52 53 }54 }55 int main(int argc, char const *argv[])56 {57 //freopen("input.txt","r",stdin);58 while(scanf("%d %d",&w, &h) != EOF && (w != 0 && h != 0)) {59 60 for(int i = 0; i < h; i++) {61 for(int j = 0; j < w; j++) {62 scanf("%d",&board[i][j]);63 if(board[i][j] == 2) {64 sx = i;65 sy = j;66 }67 }68 }69 ans = max_ans;70 dfs(sx, sy, 1);71 if(ans == max_ans) {72 puts("-1");73 }74 else {75 printf("%d\n",ans);76 }77 }78 return 0;79 }
这道题我提交了很多次,尤其是31 行到46行,必须把逻辑搞清楚,不然很容易错。