问题标题: 酷町堂:1257 迷宫寻宝

0
0
已解决
胡景波
胡景波
中级光能
中级光能

1257   迷宫寻宝

经验值:1600 时间限制:3000毫秒

题目描述 Description

小王设计了一个9行9列的迷宫:

1,1,1,1,1,1,1,1,1

1,0,0,1,0,0,1,0,1

1,0,0,1,1,0,0,0,1

1,0,1,0,1,1,0,1,1

1,0,0,0,0,1,0,0,1

1,1,0,1,0,1,0,0,1

1,1,0,1,0,1,0,0,1

1,1,0,1,0,0,0,0,1

1,1,1,1,1,1,1,1,1

0表示道路,1表示墙。

现在输入一个坐标作为起点,再输入一个坐标作为宝贝的存放位置,问现在由你从起点出发,最少经过多少步可以寻到宝贝

输入描述 Input Description

第一行输入一个整数n(0<n<=100),表示有n组测试数据;
随后n行,每行有四个整数a,b,c,d(0<=a,b,c,d<=8)分别表示起点的行、列,宝贝的行、列。

输出描述 Output Description

输出n行,每行输出最少走几步,如果找不到宝贝,输出0。
(如果输入的起点、终点是墙的位置,则也拿不到宝贝,输出0)

样例输入 Sample Input

2 3 1 5 7 3 1 6 7

样例输出 Sample Output

12 11

数据范围及提示 Data Size & Hint

每次只能往上、下、左、右相邻的格子走1步,且不能超出迷宫边界。

 

#include<iostream>
#include<cstring>
using namespace std;
int n,a,b,c,d,ans=100000000,dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
bool vis[105][105];
bool map[105][105]={
    {1,1,1,1,1,1,1,1,1},
    {1,0,0,1,0,0,1,0,1},
    {1,0,0,1,1,0,0,0,1},
    {1,0,1,0,1,1,0,1,1},
    {1,0,0,0,0,1,0,0,1},
    {1,1,0,1,0,1,0,0,1},
    {1,1,0,1,0,1,0,0,1},
    {1,1,0,1,0,0,0,0,1},
    {1,1,1,1,1,1,1,1,1},
};
void dfs(int x,int y,int bs){
    if(x==c&&y==d){
        ans=min(ans,bs);
        return;
    }
    for(int i=0;i<4;i++){
        int ax=dir[i][0]+x,ay=dir[i][1]+y;
        if(ax>=0&&ax<=8&&ay>=0&&ay<=8&&map[ax][ay]==0&&vis[ax][ay]==false){
            vis[ax][ay]=true;
            dfs(ax,ay,bs+1);
            vis[ax][ay]=false;
        }
    }
}
int main(){
    cin>>n;
    while(n--){
        cin>>a>>b>>c>>d;
        vis[a][b]=true;
        if(map[a][b]==1||map[c][d]==1){
            cout<<"0"<<endl; 
        }
        dfs(a,b,0);
        cout<<ans<<endl;
        ans=1000000;
    }
    return 0;
}


0
已采纳
刘乐宸
刘乐宸
新手天翼
新手天翼
int a[20][8]={{1,1,1,1,1,1,1,1},{1,0,0,1,0,0,1,0},{1,0,0,1,1,0,0,0},{1,0,1,0,1,1,0,1},{1,0,0,0,0,1,0,0},{1,1,0,1,0,1,0,0},{1,1,0,1,0,1,0,0},{1,1,0,1,0,0,0,0}};
int sir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
bool flag[11][11];
int n;
int sum;
int nextc,nextr;
int a2,b,c,d;
void search(int c,int r,int c2,int d,int t)
{
    if(c==c2&&r==d)
    {
        if(t<sum) sum=t;
        return ;
    }
    else
    {
        flag[c][r]=true;
        for(int i=0;i<=3;i++)
        {
            nextc=c+sir[i][0];
            nextr=r+sir[i][1];
            if(nextc>=1&&nextc<=7&&nextr>=1&&nextr<=7&&a[nextc][nextr]==0&&flag[nextc][nextr]==false)
                search(nextc,nextr,c2,d,t+1);
        }
        flag[c][r]=false;
    }
}

主函数自己写

0
0
0
0
0
汪恺恒
汪恺恒
中级启示者
中级启示者

你是TLE还是WA

TLE加个剪枝

还有你这vis数组要置0

我要回答