1.w和h的顺序搞反了
2.模拟往一个方向滑的时候用不同的数字表示不同的情况(find函数)
3.深搜终止条件不能忘
4.复制粘贴相似代码要谨慎
题目就是直接四个方向搜就ok。虽然调试样例调试了很久,但是一把直接AC爽。
#include <cstdio>
#include <algorithm>
using namespace std;
#define INF 100000
int maps[102][102];
int w, h;
int sx, sy;
int vx[] = {0, 0, 1, -1};
int vy[] = {1, -1, 0, 0};
int find(int k, int x, int y)
{
int ans = 0;
for(;;){
x += vx[k];y += vy[k];
if(x < 1 || x > w || y < 1 ||y > h)
return -1;
if(maps[x][y] == 1)
return ans;
if(maps[x][y] == 3)
return INF;
ans++;
}
}
int dfs(int x, int y, int cnt)
{
int cmd, ans = -1;
if(cnt > 10)
return -1;
if((cmd = find(0, x, y)) > 0 && cmd < INF){
maps[x][y + cmd + 1] = 0;
int temp;
if((temp = dfs(x, y + cmd, cnt + 1)) > 0)
ans = ans == -1?temp:(min(ans, temp));
//printf("0000 %d\n", ans);
maps[x][y + cmd + 1] = 1;
}else if(cmd == INF)
return (cnt < 10) ? cnt + 1 : -1;
if((cmd = find(1, x, y)) > 0 && cmd < INF){
maps[x][y - cmd - 1] = 0;
int temp;
if((temp = dfs(x, y - cmd, cnt + 1)) > 0)
ans = ans == -1?temp:(min(ans, temp));
maps[x][y - cmd - 1] = 1;
}else if(cmd == INF)
return (cnt < 10) ? cnt + 1 : -1;
if((cmd = find(2, x, y)) > 0 && cmd < INF){
maps[x + cmd + 1][y] = 0;
int temp;
if((temp = dfs(x + cmd, y, cnt + 1)) > 0)
ans = ans == -1?temp:(min(ans, temp));
maps[x + cmd + 1][y] = 1;
}else if(cmd == INF)
return (cnt < 10) ? cnt + 1 : -1;
if((cmd = find(3, x, y)) > 0 && cmd < INF){
maps[x - cmd - 1][y] = 0;
int temp;
if((temp = dfs(x - cmd, y, cnt + 1)) > 0)
ans = ans == -1?temp:(min(ans, temp));
maps[x - cmd - 1][y] = 1;
}else if(cmd == INF)
return (cnt < 10) ? cnt + 1 : -1;
return ans;
}
int main()
{
while(scanf("%d%d", &h, &w) && w)
{
for(int i = 1; i <= w; i++)
for(int j = 1; j <= h; j++)
{
scanf("%d", &maps[i][j]);
if(maps[i][j] == 2) {sx = i; sy = j;}
}
printf("%d\n", dfs(sx, sy, 0));
}
return 0;
}