hdu1010

差距啊,知道整体思路,知道如何剪枝了,结果效率还是比别人慢那么多,唉……

奇偶性剪枝还有路径剪枝,具体看下大牛的结题报告吧

http://acm.hdu.edu.cn/forum/read.php?tid=6158

写得好详细,学习了

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
char map[9][9];
int n,m,t,di,dj; //(di,dj):门的位置
bool escape;
int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}}; //分别表示下、上、左、右四个方向
void dfs(int si,int sj,int cnt)  //表示起始位置为(si,sj),要求在第cnt秒达到门的位置
{
    int i,temp;
    if( si>n || sj>m || si<=0 || sj<=0 ) return;
    
    if( si==di && sj==dj && cnt==t )
    {
        escape = 1;
        return;
    }
        temp = (t-cnt) - abs(si-di) - abs(sj-dj);
    if( temp<0 || temp&1 ) return; 
    
    for( i=0; i<4; i++ )
    {
        if( map[ si+dir[i][0] ][ sj+dir[i][1] ] != 'X')
        {
            map[ si+dir[i][0] ][ sj+dir[i][1] ] = 'X';
                
                dfs(si+dir[i][0], sj+dir[i][1], cnt+1);
            
            if(escape) return;
            
            map[ si+dir[i][0] ][ sj+dir[i][1] ] = '.';
        }
    }
    
    return;
}

int main()
{
    int i,j,si,sj;
    
    while( cin >> n >> m >> t)
    {
        if( n==0 && m==0 && t==0 )
            break;
    
        int wall = 0;
        for( i=1; i<=n; i++ )
            for( j=1; j<=m; j++ )
            { 
                cin >> map[i][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 )
            {
                cout << "NO" << endl;
                continue;
            }
            
            escape = 0;
            map[si][sj] = 'X';
            
            dfs( si, sj, 0 );
            
            if( escape ) cout << "YES" << endl; 
            else cout << "NO" << endl; 
    }
    
    return 0;
}
原文地址:https://www.cnblogs.com/nanke/p/2122723.html