poj 3009(dfs+回溯 模拟)

模拟就行。题目的意思是找最短的路,但是每次地图都要改变。开始用bfs,把地图保存下来,自然tle了。题目的意思不超过10步。所以可以dfs把所有的可行解找出来,求最少步数。

View Code
  1 #include <iostream>

  2 #include <cstdio>

  3 #include <cstring>

  4 #include <algorithm>

  5 #include <cmath>

  6 

  7 using namespace std;

  8 

  9 #define MAXN 21

 10 int map[MAXN][MAXN];

 11 int w,h;

 12 int ans;

 13 

 14 struct pos

 15 {

 16     int x,y;

 17 };

 18 pos st;

 19 int move(int dir,int step,pos & tmp)

 20 {

 21     switch(dir)

 22     {

 23         case 1:

 24             if(st.x-1<0 || map[st.x-1][st.y]==1)

 25                 return 0;

 26             st.x--;

 27             while(st.x>=0)

 28             {

 29                 if(map[st.x][st.y]==3)

 30                 {

 31                     if(ans>step)

 32                         ans=step;

 33                     return 1;

 34                 }

 35                 if(map[st.x][st.y]==1)

 36                 {

 37                     tmp=st;

 38                     map[st.x][st.y]=0;

 39                     st.x++;

 40                     return 2;

 41                 }

 42                 st.x--;

 43             }

 44             return 0;

 45             break;

 46         case 2:

 47             if(st.x+1>=h || map[st.x+1][st.y]==1)

 48                 return 0;

 49             st.x++;

 50             while(st.x<h)

 51             {

 52                 if(map[st.x][st.y]==3)

 53                 {

 54                     if(ans>step)

 55                         ans=step;

 56                     return 1;

 57                 }

 58                 if(map[st.x][st.y]==1)

 59                 {

 60                     tmp=st;

 61                     map[st.x][st.y]=0;

 62                     st.x--;

 63                     return 2;

 64                 }

 65                 st.x++;

 66             }

 67             return 0;

 68             break;

 69         case 3:

 70             if(st.y-1<0 || map[st.x][st.y-1]==1)

 71                 return 0;

 72             st.y--;

 73             while(st.y>=0)

 74             {

 75                 if(map[st.x][st.y]==3)

 76                 {

 77                     if(ans>step)

 78                         ans=step;

 79                     return 1;

 80                 }

 81                 if(map[st.x][st.y]==1)

 82                 {

 83                     tmp=st;

 84                     map[st.x][st.y]=0;

 85                     st.y++;

 86                     return 2;

 87                 }

 88                 st.y--;

 89             }

 90             return 0;

 91             break;

 92         case 4:

 93             if(st.y+1>w || map[st.x][st.y+1]==1)

 94                 return 0;

 95             st.y++;

 96             while(st.y<w)

 97             {

 98                 if(map[st.x][st.y]==3)

 99                 {

100                     if(ans>step)

101                         ans=step;

102                     return 1;

103                 }

104                 if(map[st.x][st.y]==1)

105                 {

106                     tmp=st;

107                     map[st.x][st.y]=0;

108                     st.y--;

109                     return 2;

110                 }

111                 st.y++;

112             }

113             return 0;

114             break;

115     }

116 }

117 void dfs(int step)

118 {

119     if(step==10) return ;

120     for(int k=1;k<=4;k++)

121     {

122         pos pre,tmp;

123         pre.x=st.x;pre.y=st.y;

124         if(move(k,step+1,tmp)==2)

125         {

126             dfs(step+1);

127             map[tmp.x][tmp.y]=1;

128         }

129         st.x=pre.x;st.y=pre.y;

130     }

131 

132 }

133 int main()

134 {

135     while(scanf("%d%d",&w,&h))

136     {

137         if(!w && !h) break;

138         for(int i=0;i<h;i++)

139             for(int j=0;j<w;j++)

140             {    

141                 scanf("%d",&map[i][j]);

142                 if(map[i][j]==2)

143                 {

144                     map[i][j]=0;

145                     st.x=i;

146                     st.y=j;

147                 }

148             }

149         ans=11;

150         dfs(0);

151         if(ans==11)

152             printf("-1\n");

153         else

154             printf("%d\n",ans);

155     }

156     return 0;

157 }

你可能感兴趣的:(poj)