來源
[苗棟棟]原創
最近好久沒做搜尋的題了,感覺手都有點生了,拿這個題練練手,水題一個,直接用dfs就可以直接水過,也可以用bfs做,對bfs還是很熟練啊,這道題思路還是很清晰的,走過就標記,但是開始那個計數的沒控制好,導致一直沒結果,還有就是dfs用遞迴寫,一定要控制好遞迴的結束情況,不然到時候都不知道錯在哪,還是要溫故而知新啊,對以前學過的東西還是要經常複習一下;
下面是水過的代碼;
#include <cstdio>#include <cstring>#define min(x,y) x>y?y:x //這種寫法是參考別人的using namespace std;int dir[4][2]={0,1,0,-1,1,0,-1,0};int map[9][9]={ {1,1,1,1,1,1,1,1,1}, {1,0,0,1,0,0,1,0,1}, {1,0,0,1,1,0,0,0,1}, {1,0,1,0,1,1,0,1,1}, {1,0,0,0,0,1,0,0,1}, {1,1,0,1,0,1,0,0,1}, {1,1,0,1,0,1,0,0,1}, {1,1,0,1,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1},};int c,d,m;void dfs(int a,int b,int ans){ int x,y; if(a==c&&b==d) { m=min(m,ans); return ; //返回,遞迴結束,返回上一層; } map[a][b]=1;//標記走過的路徑 for(int i=0;i<4;i++) { x=a+dir[i][0]; y=b+dir[i][1]; if(map[x][y]==0)//對路徑進行判斷 { dfs(x,y,ans+1);//再次搜尋 map[x][y]=0; } }}int main(){ int n,a,b; scanf("%d",&n); while(n--) { m=9999;//這裡用一個比較大的數和計數的進行比較; scanf("%d%d%d%d",&a,&b,&c,&d); dfs(a,b,0); map[a][b]=0; printf("%d\n",m); } return 0;}