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;
}
教训啊!一个个写的时候还很容易出错,改了近十分钟错才发现了一个大于号的错误……
不过最终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;
}
相关文章推荐
- POJ3009(Curling 2.0, DFS)
- POJ 3009 Curling 2.0 (DFS)
- POJ-3009-Curling 2.0
- POJ 3009 Curling 2.0 (DFS)
- POJ 3009 Curling 2.0(DFS)
- POJ 3009 Curling 2.0(bfs + 状态压缩)
- poj3009——Curling 2.0
- Curling 2.0 POJ - 3009(DFS,障碍关联位置)
- poj3009 Curling 2.0 dfs
- Curling 2.0(POJ--3009
- Curling 2.0 (POJ 3009)
- poj3009 Curling 2.0
- POJ 3009 Curling 2.0 DFS
- POJ 3009:Curling 2.0
- poj 3009 Curling 2.0 (dfs)
- POJ 3009:Curling 2.0
- POJ 3009 Curling 2.0
- POJ 3009 Curling 2.0
- poj 3009 ( Curling 2.0 深搜 搜直线)
- POJ 3009 Curling 2.0 dfs