每日刷题36

资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
  勇士们不小心进入了敌人的地雷阵(用n行n列的矩阵表示,'*‘表示某个位置埋有地雷,’-'表示某个位置是安全的),他们各自需要在规定的步数(一步代表走到和当前位置相邻的位置)内绕开地雷到达出口(第一行第一格,即坐标为(0,0)的位置)才能完成任务,告诉你每个勇士的位置(x,y)和规定的步数s,请你判断每个勇士能否顺利完成任务(1代表“能”,-1代表“不能”)。
输入格式
  输入数据的第一行为一个整数n;第二行至第n+1行是n行n列地雷阵的矩阵表示(见输入样例);第n+2行至最后一行每行是一个勇士的位置x、y和到达出口规定的最大步数s,三个整数间用空格隔开。
输出格式
  按顺序输出对每个勇士是否能顺利完成任务的判断(1代表“能”,-1代表“不能”),对每个勇士的判断占一行。
样例输入
5

–*–
-
-

-
0 1 1
0 4 3
1 1 3
1 4 2
2 0 3
3 0 4
3 3 2
4 1 3
样例输出
1
-1
1
-1
1
1
-1
-1
数据规模和约定
  1≤n≤500,0≤x≤n-1,0≤y≤n-1,1≤s≤500
解答;我使用了dfs但是很不幸超时了;

#include<iostream>
using namespace std;
typedef long long ll;
char dp[501][501];
int visited[501][501];
ll n;
int dfs(int x,int y,int sum){
    
    
    if(x==0 && y==0 &&sum>=0){
    
    
        return 1;
    }
    if(sum==0)
        return 0;
    if(!visited[x][y] && x>=0 && x<n && y>=0&&y<n && sum>0){
    
    
        visited[x][y]=1;
        if(dp[x-1][y]=='-'){
    
    
            if(dfs(x-1,y,--sum))
                return 1;
        visited[x][y]=0;
        ++sum;
        }
        if(dp[x+1][y]=='-'){
    
    
            if(dfs(x+1,y,--sum))
                return 1;
          visited[x][y]=0;
        ++sum;}
        if(dp[x][y+1]=='-'){
    
    
            if(dfs(x,y+1,--sum))
                return 1;
        visited[x][y]=0;
        ++sum;}
        if(dp[x][y-1]=='-'){
    
    
            if(dfs(x,y-1,--sum))
                return 1;
        visited[x][y]=0;
        ++sum;}
    }
    visited[x][y]=0;
   return 0;
}
int main(){
    
    
    cin >> n;
    for(int i = 0;i<n;i++)
        for(int j =0;j<n;j++)
            cin >> dp[i][j];
    int x,y,sum;
    while( cin >> x >> y >> sum){
    
    
       
       
        for(int i = 0;i<n;i++)
            for(int j = 0;j<n;j++)
            visited[i][j]=0;
        if(dfs(x,y,sum))
            cout<<"1";
        else
            cout<<"-1";
        cout<<endl;
    }
}

逻辑比较清晰了我就不解释啦

猜你喜欢

转载自blog.csdn.net/weixin_47988292/article/details/129986461