资源限制
内存限制: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;
}
}
逻辑比较清晰了我就不解释啦