zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    Sublime Text 3065
    FBX .NET
    macbook pro的usb串口失效的的处理方法
    CMAKE使用
    Ctrl+Scroll改变所有Editor的缩放比例 (Code::Blocks)
    如何在Mac OSX 10.10上安装GDB
    yum安装指定(特定)版本(旧版本)软件包的方法
    MinGW: TOO MANY SECTIONS issue
    轻量级Image Library
    CodeLite的姿势
  • 原文地址:https://www.cnblogs.com/nanke/p/2122723.html
Copyright © 2011-2022 走看看