poj 3009 Curling 2.0
2017-04-17 20:29
411 查看
Curling 2.0
只要步数超过了10||超过了之前已经存在的步数,就可以不用再继续往下找了
#include <iostream>
#include <cstdio>
#include <string.h>
#include <cstdlib>
#include <algorithm>
using namespace std;
int n, m;
int Map[30][30];
int dx[] = {0,0,1,-1};
int dy[] = {1,-1,0,0};
int sx, sy;
int ex, ey;
int flag;
int ans;
void dfs(int x, int y, int step)
{
// printf("step==%d\n", step);
// for(int i = 1;i <= n;i++){
// for(int j = 1;j<=m;j++){
// printf("%d ", Map[i][j]);
// }
// cout << endl;
// }
// printf("X%d Y%d\n", x, y);
// if(flag) return;
if(step>=ans){
return;
}
int F = 0;
for(int i = 0;i < 4;i++){
int xx = x+dx[i];
int yy = y+dy[i];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&Map[xx][yy]!=1){
int xxx = x;
int yyy = y;
F = 0;
while(1){
xxx+=dx[i];
yyy+=dy[i];
// printf("%d %d %d\n", xxx, yyy, Map[xxx][yyy]);
if(xxx<=0||xxx>n||yyy<=0||yyy>m){
F =1;
break;
}
if(Map[xxx][yyy]==0){
continue;
}else if(Map[xxx][yyy]==1){
Map[xxx][yyy] = 0;
xxx-=dx[i];
yyy-=dy[i];
break;
}else if(Map[xxx][yyy]==3){
// printf("%d %d\n", step+1, ans);
if(step+1<ans){
ans = step+1;
flag = 1;
return;
}
}
}
if(F == 1) continue;
dfs(xxx,yyy,step+1);
Map[xxx+dx[i]][yyy+dy[i]] = 1;
}
}
}
int main()
{
while(~scanf("%d %d", &m, &n)){
if(n==0||m==0) break;
for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j++){
scanf("%d", &Map[i][j]);
if(Map[i][j]==2){
Map[i][j] = 0;
sx = i; sy = j;
}else if(Map[i][j] ==3){
ex = i; ey = j;
}
}
}
flag = 0;
ans = 11;
dfs(sx,sy,0);
if(flag&&ans<=10){
printf("%d\n", ans);
}else{
printf("-1\n");
}
}
return 0;
}
只要步数超过了10||超过了之前已经存在的步数,就可以不用再继续往下找了
#include <iostream>
#include <cstdio>
#include <string.h>
#include <cstdlib>
#include <algorithm>
using namespace std;
int n, m;
int Map[30][30];
int dx[] = {0,0,1,-1};
int dy[] = {1,-1,0,0};
int sx, sy;
int ex, ey;
int flag;
int ans;
void dfs(int x, int y, int step)
{
// printf("step==%d\n", step);
// for(int i = 1;i <= n;i++){
// for(int j = 1;j<=m;j++){
// printf("%d ", Map[i][j]);
// }
// cout << endl;
// }
// printf("X%d Y%d\n", x, y);
// if(flag) return;
if(step>=ans){
return;
}
int F = 0;
for(int i = 0;i < 4;i++){
int xx = x+dx[i];
int yy = y+dy[i];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&Map[xx][yy]!=1){
int xxx = x;
int yyy = y;
F = 0;
while(1){
xxx+=dx[i];
yyy+=dy[i];
// printf("%d %d %d\n", xxx, yyy, Map[xxx][yyy]);
if(xxx<=0||xxx>n||yyy<=0||yyy>m){
F =1;
break;
}
if(Map[xxx][yyy]==0){
continue;
}else if(Map[xxx][yyy]==1){
Map[xxx][yyy] = 0;
xxx-=dx[i];
yyy-=dy[i];
break;
}else if(Map[xxx][yyy]==3){
// printf("%d %d\n", step+1, ans);
if(step+1<ans){
ans = step+1;
flag = 1;
return;
}
}
}
if(F == 1) continue;
dfs(xxx,yyy,step+1);
Map[xxx+dx[i]][yyy+dy[i]] = 1;
}
}
}
int main()
{
while(~scanf("%d %d", &m, &n)){
if(n==0||m==0) break;
for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j++){
scanf("%d", &Map[i][j]);
if(Map[i][j]==2){
Map[i][j] = 0;
sx = i; sy = j;
}else if(Map[i][j] ==3){
ex = i; ey = j;
}
}
}
flag = 0;
ans = 11;
dfs(sx,sy,0);
if(flag&&ans<=10){
printf("%d\n", ans);
}else{
printf("-1\n");
}
}
return 0;
}
相关文章推荐
- POJ 3009-Curling 2.0 [dfs] 《挑战程序设计竞赛》2.1
- POJ-3009 Curling 2.0 解题报告(搜索) 冰壶游戏
- poj 3009 Curling 2.0
- poj 3009 Curling 2.0
- Curling 2.0 POJ - 3009
- POJ 3009 Curling 2.0
- poj 3009 Curling 2.0
- POJ3009-Curling 2.0
- Curling 2.0 (poj 3009 dfs)
- Curling 2.0 POJ - 3009 dfs
- POJ 3009 Curling 2.0(深搜)
- poj3009 Curling 2.0
- POJ - 3009 - Curling 2.0(dfs)
- 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)
- POJ-3009 Curling 2.0 (深搜)