1. 程式人生 > >HDU 1010 比較坑人的一道搜尋題

HDU 1010 比較坑人的一道搜尋題

本人當初只是想到用搜索做,上手就是BFS結果WA了,後來反應過來只能用DFS來做

提交了21次,全TLE,後來在多次努力下找到了大量的陷阱,為還在為此題困擾的人指指路

1.奇偶剪枝

很簡單的一個概念

設起點座標是bx,by;終點座標是ex,ey;

最短路徑是abs(bx-ex)+abs(by-ey)

但是我們可以很顯然的看出來,無論是走,我們的步數肯定比最短路徑數多一個偶數

所以,簡化的第一點來了:如果題目中輸入的步數比最短路徑數多得是一個奇數,那麼我們永遠也不可能走到,所以直接輸出NO;

2.路徑剪枝

在DFS當前的過程的路數中一旦大於等於要求的步數並且還沒有找到終點,直接輸出NO

3.最讓人後怕的一點

我從自學DFS以來一直沒有注意到有一點非常的害怕,DFS是用遞迴實現的,那麼如果我們找到了終點並且路數也符合,不能只是讓指示變數變值那麼簡單

我們要在每次遞迴返回後面再加上一個判斷,目的是終止查詢,如果不這樣做,就算找到了結果是YES我們也必須等到整個圖全部被掃描完才可以結束程式

自然而然就會TLE了

附上AC程式碼

#include"iostream"
#include"cstdio"
#include"cstring"
using namespace std;


char map[10][10];
int book[10][10];
int n,m,t;
int flag=0;
int nextk[4][2]={{0,1},{1,0},{-1,0},{0,-1}};
int bx,by;
int ex,ey; 
int w;


void dfs(int x,int y,int len)
{
int dx,dy;
for(int i=0;i<=3;i++)
{
dx=x+nextk[i][0];
dy=y+nextk[i][1];
if(dx==ex&&dy==ey&&t==len+1)
{
flag=1;
return ;
}
if(len>=t)                                 //路徑剪枝
{
return ;
}
else
{
if(dx<1||dx>n||dy<1||dy>m||map[dx][dy]=='X')
{
continue;
}
else
{
if(book[dx][dy]==0&&map[dx][dy]=='.')
{
book[dx][dy]=1;
dfs(dx,dy,len+1);
if(flag==1)                                   //一定要記住要返回
{
return ;
}
book[dx][dy]=0;
}
}
}
}
}


int main()
{
while(1)
{
flag=0;
memset(book,0,sizeof(book));
memset(map,0,sizeof(map));
cin>>n>>m>>t;
if(n==0&&m==0&&t==0)
{
break;
}
else
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>map[i][j];
if(map[i][j]=='S')
{
bx=i;
by=j;
}
if(map[i][j]=='D')
{
ex=i;
ey=j;
}
}
}
w=abs(ex-bx)+abs(ey-by);
if((t-w)%2==1);                            //奇偶剪枝
else
{
   book[bx][by]=1;
   dfs(bx,by,0);
}
if(flag==1)
{
cout<<"YES"<<endl;
}
else
{
cout<<"NO"<<endl;

}
}
return 0;

相關推薦

HDU 1010 比較坑人一道搜尋

本人當初只是想到用搜索做,上手就是BFS結果WA了,後來反應過來只能用DFS來做 提交了21次,全TLE,後來在多次努力下找到了大量的陷阱,為還在為此題困擾的人指指路 1.奇偶剪枝 很簡單的一個概念 設起點座標是bx,by;終點座標是ex,ey; 最短路徑是abs(bx-e

一道leetcode的收獲如何比較字符串的大小重寫sort中的compare[](string &s,string &t){return s+t>t+s};

etc ++ ansi 匿名 gin leet clas size_t first KEY:一種很好的想法,寫法也很好,使用for(auto i:num)遍歷訪問num lambda表達式重寫比較compare參數,相當完美 while處理[0,0,0]情況的輸出。優雅的解

HDU 100道搜尋 每天幾個練練手 mark

一般是不用hash的,所以很多時候稱之為”暴力”,也就是窮舉所有情況,一般看幾個我們OJ的dfs的版本的題目就可以模仿著做了,因為牽涉到遞迴,初學者學的時候最好能舉一反三,理解其中真諦. DFS --- EASY(15)  Tempter of the Bone  S

給定N個節點求組成二叉搜尋樹個數——從一道演算法探討神奇的Catalan數

引 Catalan數,中文卡特蘭數又稱卡塔蘭數,是組合數學中一個常出現在各種計數問題中的數列。一旦入坑,你會發現這個數列相當有意思,能夠應用於很多看起來特別複雜的計算場景,當然,並能將之迎刃而解。 :卡塔蘭數是組合數學中一個常在各種計數問題中出現的數列

HDU 2899(搜尋,二分)

Strange fuction Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 80    Accepted Sub

HDU 2199(搜尋,二分)

Can you solve this equation? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 235  

hdu 1034 & poj 1077 Eight 傳說中的八數碼問題。真是一道,A*演算法+康託展開

Eight Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13506    Accepted Submiss

HDU 1704 (搜尋)

there are N ACMers in HDU team.ZJPCPC Sunny Cup 2007 is coming, and lcy want to select some excellent ACMers to attend the contest. There have been M match

Fire Net HDU——1045 (搜尋

Problem Description    Suppose that we have a square city with straight streets. A map of a city is a

HDU 2289(搜尋,二分、幾何)

Cup Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 486    Accepted Submission(s):

一道

tin res += tint cal 簡化 rgs ret turn 題目:計算13+23+33+……+(n-1)3+n3. 這個式子一般的解法,應當是用循環的方式:先算13,再算23,相加,再算33,相加……算出結果。 1 import java.util.Scan

每天一道Java[1]

就會 p s 提高 清除 轉儲 處理 攻擊 大神 如何使用 問題:char[]與String相比,有什麽優勝的地方? 回答: 針對安全保密高的信息,char[]比String做得更好。因為String是不可變得,即使你修改原先的變量,實際上也是在內存中新建一個對

每天一道Java[6]

parse -m 每天 t對象 logs 父類 stringbu ont text 題目 String字符串怎麽轉換為Date,Date又怎麽轉換成String字符串 解答 String->Date 主要用到類SimpleDateFormat

每天一道Java[7]

java 什麽是 我們 present 使用 指定 以及 let app 題目 什麽是REST原則,請解釋RESTful架構,以及其設計思想? 解答 REST,全稱為Representation State Transfer,是一種互聯網軟件的架構原則

[BestCoder Round #3] hdu 4907 Task schedule (模擬簡單

using mes family set key problem 占用 時間 task Task schedule Problem Description 有一臺機器,而且給你這臺機器的工作表。工作表上有n個任務,機器在ti時間運行第i個任務,1秒就可以完畢

一道CTF引發的思考-MySQL的幾個特性(續)

get 是否 區分 sql sel admin database pan blog 0x00 背景   這兩天處於轉牛角尖的狀態,非常不好。但是上一篇的中提到的問題總算是總結了些東西。 傳送門:疑問點0x02(4) 0x01 測試過程 (1)測試環境情況:創建了如下測試

每天一道Java[9]

public interface jvm image 外部 .cn c代碼 bsp 底層 題目 native關鍵字的作用是什麽? 解答 首先,需了解JNI(Java Native Interface),它是連接Java平臺與本地C代碼的一個API。 其次,

每天一道Java[11]

解答 huang 同步鎖 每次 都是 對象 問題 不能 color 題目 synchronized怎麽實現線程同步?請修改《每天一道Java題[10]》中的MyRunnableThread類以解決三個線程都獲取到10的問題。 解答 方法一: 采用synchro

杭電(hdu)2053 Switch Game 水

center ++ class chang names top weight ext == Switch Game Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (J

HDU 1010 Tempter of the Bone

mem ssh tdi tin out 都是 turn == con dfs+剪枝 題意是說一僅僅狗要逃出迷宮,可是必須在某個時間點剛好到出口。 開始裸了一個dfs,TLE。。。剪枝沒有啥思路。本來想用bfs先判是否能到達,感覺不靠譜。