程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu 1010 (DFS+剪枝)

hdu 1010 (DFS+剪枝)

編輯:C++入門知識

BFS,DFS,都可以,只要拍注意剪枝就可以了。

注意題目中要求只能在T秒到D。

題目中有坑。測試數據中每行有多余的空格。。。就這一點卡了一個晚上

 

 

[cpp]
#include"stdio.h"  
#include"string.h"  
#include"math.h"  
#define zz 10  
 
int mark[zz][zz]; 
char map[zz][zz]; 
int n,m,t,s,e,ss,ee,f; 
int dir[4][2]={1,0,0,1,-1,0,0,-1}; 
 
void dfs(int x,int y,int t) 

    int i,dis; 
    int xx,yy; 
    if(x==ss&&y==ee) 
    { 
        if(t==0)f=1; 
        return ; 
    } 
    if(f==1)return ; 
    dis=abs(x-ss)+abs(y-ee); 
    if(dis>t||(t-dis)%2!=0)return ; 
    for(i=0;i<4;i++) 
    { 
        xx=x+dir[i][0]; 
        yy=y+dir[i][1]; 
        if(xx>=0&&xx<n&&yy>=0&&yy<m&&!mark[xx][yy]&&map[xx][yy]!='X') 
        { 
            mark[xx][yy]=1; 
            dfs(xx,yy,t-1); 
            mark[xx][yy]=0; 
        } 
    } 

 
int main() 

    int i,j,k; 
    while(scanf("%d %d %d%*c",&n,&m,&t)!=-1&&(n+m+t)) 
    { 
        k=0; 
        memset(map,0,sizeof(map)); 
        memset(mark,0,sizeof(mark)); 
        for(i=0;i<n;i++) 
        { 
            for(j=0;j<m;j++) 
            { 
                scanf("%c",&map[i][j]); 
                if(map[i][j]=='S') 
                    s=i,e=j; 
                if(map[i][j]=='D') 
                    ss=i,ee=j,k++; 
                if(map[i][j]=='.') 
                    k++; 
            } 
            scanf("%*c"); 
        } 
         
        if(k<t) 
        { 
            printf("NO\n"); 
            continue; 
        } 
        f=0; 
        mark[s][e]=1; 
        dfs(s,e,t); 
        if(f==1)printf("YES\n"); 
        else printf("NO\n"); 
    } 
    return 0; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved