设为首页 加入收藏

TOP

HDU 1010――tempter of the bone
2014-11-23 21:42:19 来源: 作者: 【 】 浏览:3
Tags:HDU 1010 tempter the bone

来源:点击打开链接

看上去数据规模很小,但是必须要剪枝,否则直接爆TLE。

通过这个题可以练习奇偶剪枝。

另外:还有一个优化方式,如果所有步数走完了门还没关,则直接返回结果"NO".

#include 
#include 
#include 
#include 
using namespace std;

int n,m,tarstep;
int tari,tarj;
int si,sj;
char map[10][10];
int dir[4][2]={0,1,0,-1,1,0,-1,0};
int ok=0;

void dfs(int si,int sj,int step)
{
    int temp;
    if(si>n || sj>m || si<=0 || sj<=0)
        return;
    if(step==tarstep && si==tari && sj==tarj)
        ok=1;
    if(ok==1)
        return;
     //奇偶剪枝
    temp=(tarstep-step)-abs(si-tari)-abs(sj-tarj);
    if(temp<0 || temp&1)
        return;
    for(int 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],step+1);
            map[si+dir[i][0]][sj+dir[i][1]]='.';
        }
    }
    return ;
}

int main()
{
    while(cin>>n>>m>>tarstep)
    {
        if(n==0 && m==0 && tarstep==0)
            break;
        int wall=0;
        for(int i=1;i<=n;i++)  //下标从1开始
        {
            for(int j=1;j<=m;j++)
            {
                cin>>map[i][j];
                if(map[i][j]=='S')
                {
                    si=i;
                    sj=j;
                }
                else if(map[i][j]=='D')
                {
                    tari=i;
                    tarj=j;
                }
                else if(map[i][j]=='X')
                    wall++;
            }

        }
        if(n*m-wall 
 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇hdu 1050 Moving Tables 下一篇hdu 4612 Warm up

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·【C语言】动态内存管 (2025-12-27 06:23:20)
·C语言中的内存管理 - (2025-12-27 06:23:16)
·C语言指南:C语言内 (2025-12-27 06:23:14)
·Redis on AWS:Elast (2025-12-27 04:19:30)
·在 Spring Boot 项目 (2025-12-27 04:19:27)