HLG 哈理工OJ 2074逃生

逃生
Time Limit: 1000 MS Memory Limit: 65536 K
Total Submit: 81(18 users) Total Accepted: 13(10 users) Rating:  Special Judge: No
Description

A沦落到了一个迷宫之中,这个迷宫由n*m个格子构成,有些格子是不能通过的,现在他要从迷宫入口(1,1)的格子走到迷宫出口(n,m)的格子。

因为小A的方向感很弱,转多了会晕,所以他走到目的地的时候,最多能转z次,否则他就永远晕倒在原地了,到了出口也没法出去了。

请你告诉他最少能经过多少个格子走出迷宫。

Y(1,1)出发到达的第一个点都可以认为不用转向。

Input

有多组测试数据。

对于每组测试数据,第一行为3个整数n, mz,表示n*m的迷宫,最多能转z次。

接下来是n*m的字符矩阵,仅由01表示,0表示可以通过,1表示不可以通过。

2<=n,m<=100 1<=z<=50

Output

对于每组测试数据,输出一行,包含一个整数,为经过的最少格子数。如果无法到达目的地,输出-1

Sample Input
2 3 3 011 000 3 2 3 01 11 00 5 5 3 00000 00000 00101 01000 00000 
Sample Output
4 -1 9 
Source
"科林明伦杯"哈尔滨理工大学第四届ACM程序设计竞赛(预选赛)
/*这个题如果用正常人的思维广搜的情况下 是一定会WA的.*/

这里普及一下广搜的特性.

正常的一步一步走的情况下:
算法不管你拐多少次弯是最少拐弯次数.只要劳资走到了终点 劳资就成功了~

这里广搜真的不如深搜好用........

蓝后默默的贴上AC代码~

/*解题关键:一搜到底 搜一次之后.一定要拐一次0.0
广搜特性:无脑寻找终点 只要找到了就行 所以一定要一搜到底*/


#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
char a[1211][1211];
int vis[1221][1212];
int dir[4][2] = {{-1,0}, {0, 1}, {1, 0}, {0, -1}};
struct zuobiao
{
    int x,y,step;
}now,nex;
int n,m,z;
void bfs(int x,int y)
{
    queue<zuobiao>s;
    now.x=x;
    now.y=y;
    now.step=0;
    vis[x][y]=1;
    s.push(now);
    while(!s.empty())
    {
        now=s.front();
        s.pop();
        for(int i=0;i<4;i++)
        {
            nex.x=now.x+dir[i][0];
            nex.y=now.y+dir[i][1];
            nex.step=now.step;
            for(int i=0;i<4;i++)
            {
            nex.x=now.x+dir[i][0];
            nex.y=now.y+dir[i][1];
            nex.step=now.step;
            while(vis[nex.x][nex.y]==0&&nex.step<z&&a[nex.x][nex.y]=='0'&&nex.x>=1&&nex.x<=n&&nex.y>=1&&nex.y<=m)
            {
                vis[nex.x][nex.y]=1;//push进去的表示下一次还要转弯~0.0
                nex.step++;
                s.push(nex);
                nex.step--;
                nex.x+=dir[i][0];
                nex.y+=dir[i][1];
            }
            if(nex.x==n&&nex.y==m&&nex.step<z)
            {
                printf("%d\n", n+m-1);
                return ;
            }
        }
    }
    }
    printf("-1\n");
    return ;
}
int main()
{
     while(scanf("%d%d%d", &n, &m, &z)!= EOF)
     {
         memset(vis,0,sizeof(vis));
         for(int i=1;i<=n;i++)
         {
             scanf("%s",a[i]);
         }
         bfs(1,1);
     }
}

你可能感兴趣的:(搜索,哈理工oj)