《搜索》hdoj 1010 dfs 奇偶剪枝 路径剪枝

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char map[10][10]; int right; int n,m,t,di,dj; int move[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; void dfs(int si,int sj,int time) { int i,temp; if(si>n||sj>=m||si<=0||sj<0) return; if(si==di&&sj==dj&&time==t) {
        right=1; return; }
    temp=(t-time)-abs(si-di)-abs(sj-dj); if(temp<0||temp&1) return; for(i=0;i<4;i++) { if(map[si+move[i][0]][sj+move[i][1]]!='X') {
            map[si+move[i][0]][sj+move[i][1]]='X';
            dfs(si+move[i][0],sj+move[i][1],time+1); if(right) return;
            map[si+move[i][0]][sj+move[i][1]]='.'; } } return; } int main() { int i,j,si,sj,wall; while(~scanf("%d%d%d",&n,&m,&t)&&n+m+t) {
        wall=0; for(i=1;i<=n;i++) {
            scanf("%s",map[i]); for(j=0;j<m;j++) { if(map[i][j]=='S') {
                    si=i;
                    sj=j; } else if(map[i][j]=='D') {
                    di=i;
                    dj=j; } else if(map[i][j]=='X')
                    wall++; } } if(n*m-wall<=t) {
            printf("NO\n"); continue; }
        right=0;
        map[si][sj]='X';
        dfs(si,sj,0); if(right)
            printf("YES\n"); else
            printf("NO\n"); } return 0; }

你可能感兴趣的:(《搜索》hdoj 1010 dfs 奇偶剪枝 路径剪枝)