做的非常恶心的一题,一个脑残错找了N久,剪枝后还是那么慢...
#include<iostream>
#include<cstdio>
using namespace std ;
char str[10][10] ;
int tur[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}} ;
int e, n, m, t, di, dj ;
int abs(int a){
return a<0?-a:a ;
}
void dfs(int i, int j, int ct){
if(i==di&&j==dj&&ct==t)
e = 1 ;
if(e) return ;
if(i<1||i>n||j<1||j>m) return ;
int dis = t-ct - abs(i-di) - abs(j-dj) ;
if(dis<0||dis&1) return ;
for(int k=0; k<4; k++){
int x = i+tur[k][0] ;
int y = j+tur[k][1] ;
if(str[x][y]!='X'){
str[x][y]='X' ;
dfs(x, y, ct+1) ;
str[x][y]='.' ;
}
}
return ;
}
int main(){
while(~scanf("%d%d%d", &n, &m, &t)&&(n+m+t)){
int wall = 0, si, sj ;
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++){
cin >> str[i][j] ;
if(str[i][j]=='S')
si = i, sj = j ;
if(str[i][j]=='D')
di = i, dj = j ;
if(str[i][j]=='X')
wall ++ ;
}
}
if(n*m-wall<t){//能走的位置小于时间
printf("NO\n") ;
continue ;
}
e = 0 ;
str[si][sj] = 'X' ;
dfs(si, sj, 0) ;
if(e)
printf("YES\n") ;
else
printf("NO\n") ;
}
return 0 ;
#include<cstdio>
using namespace std ;
char str[10][10] ;
int tur[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}} ;
int e, n, m, t, di, dj ;
int abs(int a){
return a<0?-a:a ;
}
void dfs(int i, int j, int ct){
if(i==di&&j==dj&&ct==t)
e = 1 ;
if(e) return ;
if(i<1||i>n||j<1||j>m) return ;
int dis = t-ct - abs(i-di) - abs(j-dj) ;
if(dis<0||dis&1) return ;
for(int k=0; k<4; k++){
int x = i+tur[k][0] ;
int y = j+tur[k][1] ;
if(str[x][y]!='X'){
str[x][y]='X' ;
dfs(x, y, ct+1) ;
str[x][y]='.' ;
}
}
return ;
}
int main(){
while(~scanf("%d%d%d", &n, &m, &t)&&(n+m+t)){
int wall = 0, si, sj ;
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++){
cin >> str[i][j] ;
if(str[i][j]=='S')
si = i, sj = j ;
if(str[i][j]=='D')
di = i, dj = j ;
if(str[i][j]=='X')
wall ++ ;
}
}
if(n*m-wall<t){//能走的位置小于时间
printf("NO\n") ;
continue ;
}
e = 0 ;
str[si][sj] = 'X' ;
dfs(si, sj, 0) ;
if(e)
printf("YES\n") ;
else
printf("NO\n") ;
}
return 0 ;
}