tempter of the bone
题意
给你n,m,t,一个n*m矩阵
S代表起点,D代表终点,X代表墙,问是否可以刚好t步走到,而且走过的路不能重复走
分析
DFS
代码
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,t,sx,sy,ex,ey;
char mp[10][10];
int d[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
bool ok;
void dfs(int si,int sj,int cnt){
int i,tem;
if(si<1||si>n||sj<1||sj>m) return;//越界
if(si==ex&&sj==ey&&cnt==t){//到达
ok=1; return;
}
tem=((t-cnt)-abs(si-ex)-abs(sj-ey));
if(tem<0||tem&1) return;//奇偶剪枝
for(i=0;i<4;i++){//四个方向
if(mp[si+d[i][0]][sj+d[i][1]]!='X'){
mp[si+d[i][0]][sj+d[i][1]]='X';//避免重复
dfs(si+d[i][0],sj+d[i][1],cnt+1);
if(ok) return;
mp[si+d[i][0]][sj+d[i][1]]='.';//恢复
}
}
return;
}
int main(){
//freopen("in.txt","r",stdin);
while(cin>>n>>m>>t&&(m+n+t)){
int cnt=0;
char c;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
{
cin>>mp[i][j];
if(mp[i][j]=='S') sx=i,sy=j;
if(mp[i][j]=='X') cnt++;
if(mp[i][j]=='D') ex=i,ey=j;
}
}
ok=0;
if(m*n-cnt<=t){//剩下的不是墙的少于t,注意开始的位置
//也不是墙,所以是小于等于
cout<<"NO\n"; continue;
}
mp[sx][sy]='X';
dfs(sx,sy,0);
if(ok) cout<<"YES\n";
else cout<<"NO\n";
}
return 0;
}