您的位置:首页 > 其它

POJ: 3009 Curling 2.0

2012-04-01 17:44 316 查看
一看是dfs就直接写了,想着这个深搜限制条件比较多而且一次可以“深入好几层”(就是走很多步),所以觉得用数组模拟四个方向不好写,就一个个枚举了,写了一会儿发现其实是可以的,就这样,一个个方向的写把代码写的很长……

教训啊!一个个写的时候还很容易出错,改了近十分钟错才发现了一个大于号的错误……

不过最终1a了,也算是改过错了吧。

/*
POJ: 3009 Curling 2.0
*/
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int M = 21;

int map[M][M];
int n, m;
int startx, starty;

int dfs(int x, int y, int step)
{
if(step > 10)
return -1;

int tmp_res = 100;

int tmpx = x - 1;
int tmpy = y;
if(tmpx >= 0 && map[tmpx][tmpy] != 1) { //up
while(tmpx >= 0 && map[tmpx][y] != 1) {
if(map[tmpx][tmpy] == 3)
return step;
tmpx--;
}
if(tmpx >= 0) {
map[tmpx][tmpy] = 0;
int tmp = dfs(tmpx + 1, tmpy, step + 1);
tmp_res = tmp == -1 ? tmp_res : min(tmp, tmp_res);
map[tmpx][tmpy] = 1;
}
}

tmpx = x;
tmpy = y + 1;
if(tmpy < m && map[tmpx][tmpy] != 1) { //right
while(tmpy < m && map[tmpx][tmpy] != 1) {
if(map[tmpx][tmpy] == 3)
return step;
tmpy++;
}
if(tmpy < m) {
map[tmpx][tmpy] = 0;
int tmp = dfs(tmpx, tmpy - 1, step + 1);
tmp_res = tmp == -1 ? tmp_res : min(tmp, tmp_res);
map[tmpx][tmpy] = 1;
}
}
tmpx = x + 1;
tmpy = y;
if(tmpx < n && map[tmpx][tmpy] != 1) { //down
while(tmpx < n && map[tmpx][tmpy] != 1) {
if(map[tmpx][tmpy] == 3)
return step;
tmpx++;
}
if(tmpx < n) {
map[tmpx][tmpy] = 0;
int tmp = dfs(tmpx - 1, tmpy, step + 1);
tmp_res = tmp == -1 ? tmp_res : min(tmp, tmp_res);
map[tmpx][tmpy] = 1;
}
}

tmpx = x;
tmpy = y - 1;
if(tmpy >= 0 && map[tmpx][tmpy] != 1) { //left
while(tmpy >= 0 && map[tmpx][tmpy] != 1) {
if(map[tmpx][tmpy] == 3)
return step;
tmpy--;
}
if(tmpy >= 0) {
map[tmpx][tmpy] = 0;
int tmp = dfs(tmpx, tmpy + 1, step + 1);
tmp_res = tmp == -1 ? tmp_res : min(tmp, tmp_res);
map[tmpx][tmpy] = 1;
}
}

if(tmp_res == 100)
return -1;
return tmp_res;
}

int main()
{
//freopen("data.in", "rb", stdin);
while(scanf("%d%d", &m, &n) != EOF && (n || m)) {
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++) {
scanf("%d", &map[i][j]);
if(map[i][j] == 2) {
startx = i;
starty = j;
}
}

printf("%d\n", dfs(startx, starty, 1));
}

return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: