zoj2110 Tempter of the Bone 搜索dfs

4 篇文章 0 订阅

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1110

题目大意:翻译看的《图论算法理论,实现及应用》王桂平著,例2.1

思路:简单dfs,写好后直接TLE,看了好久还是被大腿发现找到路径后忘了写 if( findit ) return ;  简直智商着急。。。

///2014.7.25
///zoj2110

//340MS

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;

int n,m,t;
char maze[10][10];
bool visited[10][10];
int sx,sy,ex,ey;

bool findit;

const int addx[4] = {0,1,0,-1};
const int addy[4] = {1,0,-1,0};

void init(){
    for(int i=0 ; i<n ; i++)
        scanf("%s",maze[i]);

    memset(visited,false,sizeof(visited));
    for(int i=0 ; i<n ; i++){
        for(int j=0 ; j<m ; j++){
            if( maze[i][j] == 'S' )
                sx = i, sy = j;
            if( maze[i][j] == 'D' )
                ex = i, ey = j;
        }
    }
    findit = false;
}

bool hasNext(int x,int y){
    if( x<0 || x>=n || y<0 || y>=m )
        return false;
    if( visited[x][y] )
        return false;
    if( maze[x][y]=='X' )
        return false;
    return true;
}
void dfs(int x,int y,int step){
    if( findit )  return;
    if( x==ex && y==ey && step==t ){
        findit = true;
        return ;
    }
    if( step==t )
        return ;
    int temp = t-step-fabs(x-ex)-fabs(y-ey);
    if( temp<0 || temp%2 )
        return ;
    for(int i=0 ; i<4 ; i++){
        if( hasNext(x+addx[i],y+addy[i]) ){
            visited[x+addx[i]][y+addy[i]] = true;
            dfs(x+addx[i],y+addy[i],step+1);
            visited[x+addx[i]][y+addy[i]] = false;
        }
    }
}

int main(){
    while( ~scanf("%d %d %d",&n,&m,&t) && ( n+m+t ) ){
        init();
        visited[sx][sy] = true;
        dfs(sx,sy,0);
        if( findit )
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

时隔将近一年,又用非递归的方式重写了一遍,居然用了680MS。。。。

///2015.5.6
///zoj2110

///680MS

#include <iostream>
#include <cstdio>
#include <stack>
#include <cstring>
#include <cmath>
using namespace std;

int n,m,t;
int sx,sy,dx,dy;
char maze[10][10];
bool visited[10][10];
int addx[5] = {-1,0,1,0,0};
int addy[5] = {0,1,0,-1,0};
bool findit;

struct pathNode{
	int x,y;
	int d;
	int i;
};

void init(){
	memset(visited,false,sizeof(visited));
	for(int i=0 ; i<n ; i++) scanf("%s",maze[i]);
	for(int i=0 ; i<n ; i++){
		for(int j=0 ; j<m ; j++){
			if( maze[i][j]=='S' ) sx=i,sy=j;
			if( maze[i][j]=='D' ) dx=i,dy=j;
		}
	}
	findit = false;
}

bool hasNext(int x,int y){
    if( x<0 || x>=n || y<0 || y>=m )
        return false;
    if( visited[x][y] )
        return false;
    if( maze[x][y]=='X' )
        return false;
    return true;
}

bool dfs(int t){
	stack<pathNode> path;
	pathNode temp;
	temp.x=sx,temp.y=sy,temp.d=0,temp.i=0;
	path.push(temp);
	visited[sx][sy] = true;

	while( !path.empty() ){
		int x = path.top().x;
		int y = path.top().y;
		int d = path.top().d;
		int i = path.top().i;

		if( x==dx && y==dy && d==t ){
			findit = true;
			break;
		}
		int shengyu = t-d-fabs(x-dx)-fabs(y-dy);
		if( shengyu<0 || shengyu%2 || d==t || i==4 ){
			path.pop();
			visited[x][y] = false;
			continue;
		}
		int nextX = x + addx[i];
		int nextY = y + addy[i];

		if( hasNext(nextX,nextY) ){
			visited[nextX][nextY] = true;
			path.top().i ++;
			pathNode temp;
			temp.x=nextX,temp.y=nextY,temp.d=d+1,temp.i=0;
			path.push(temp);
		} else {
			path.top().i ++;
		}
	}

	if( findit ){
		return true;
	} else {
		return false;
	}
}

int main(){
	while( scanf("%d %d %d",&n,&m,&t) && (n+m+t) ){
		init();

		int shengyu = t-fabs(sx-dx)-fabs(sy-dy);
		if( shengyu<0 || shengyu%2 ){
			printf("NO\n");
		} else {
			if( dfs(t) ){
				printf("YES\n");
			} else {
				printf("NO\n");
			}
		}
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值