HDOJ1728

//在昨天的写了一个搜索图的基础上继续我的搜索之路...写了一天终于搞出来了..技术见长啊.
//这个题目WA两次.第一次基本上没有剪枝.直接全部深搜.TLE了...
//后来用了一个剪枝.就是对于已经找到过的点.如果拐弯的数目不能进行减小操作.则return ;
//这样做了以后在没取等号的情况下.WA了..后来把等号加上就AC了..暂时还没明白是怎么回事.
//还有一点就是..这里的图是从1 1 开始的.和以前的不一样.同时X Y 坐标表示也要注意.是和以前做的相反的
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
#include<string.h>
const int inf = 0x3f3f3f;
using namespace std;
int ans[105][105],row,col,arrx,arry,begx,begy,times,dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}},test;
char map[102][102];
bool vis;
bool judge(int x ,int y,int turn)//判断是否超过限制的函数.
{
    if(x >= 0 && x < row && y >= 0 && y < col && turn <= times)
    return true ;
    return false ;
}
void dfs(int x , int y , int direx , int direy , int turn)
{
    if(judge(x,y,turn))
    {
        if(ans[x][y] >= turn)//这里就是WA的原因..取等号以后就可以AC了.开的ans[][]数组用来记录到达这个点所需要的拐弯次数.
          ans[x][y] = turn;    //如果已经访问且本次拐弯次数比储存的最小拐弯次数要大.返回..属于这个DFS里面的剪枝

        else return ;          //学长说感觉应该是其他地方应该做相应的调整没有做.才会导致这样.不是因为"="本身的原因

                                    //找到原因了. 例如:(1,0)为终点,(1,1)为当前点,(0,1)先到当前点,《mturn[0][1]==1》--->mturn[1][1]=1,然后(1,2)到达当前点《mturn[1][2]==1》。如果从(1,2)到终点turn为1,如果从(0,1)到则为2。

        if(x == arrx && y == arry)//找到该点.返回.
        {
            vis = 1 ;
        }
        if(vis)return ;
        for(int i = 0 ; i < 4 ; i++)
        {
            int a = x + dir[i][0] , b = y + dir[i][1],m;
            if(map[a][b] == '.')
            {
                m = turn ;
                if(dir[i][0] != direx || dir[i][1] != direy)//如果本次走向与上一次走向不同..拐弯次数+1
                   m++;
                map[x][y] = '*';
                dfs(a,b,dir[i][0],dir[i][1],m);
                map[x][y] = '.';
            }




        }
    }
}
int main()
{
    while(scanf("%d",&test) != EOF)
    {
        while(test--)
        {
            vis = 0;
            scanf("%d%d",&row,&col);
            for(int i = 0 ; i < row ; i++)
              scanf("%s",map[i]);
            for(int i = 0 ; i < row ; i++)
            {
                for(int j = 0 ; j < col ; j++)
                  ans[i][j] = inf ;
            }
            scanf("%d%d%d%d%d",&times,&begy,&begx,&arry,&arrx);
            begy--;begx--;arry--;arrx--;//这里为了输入方便.把 1-row 1-col的图变化了一下.仍然为0->row-1 0->col-1的图.
            dfs(begx,begy,0,0,-1);//把起止坐标分别-1即可
            if(vis == 1)printf("yes\n");
            else printf("no\n");
            //printf("%d\n",ll);
        }




    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值