1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #includeview code12 #include 13 #include 14
using
namespace
std ;
15#ifdef debug
16#define bug assert
17#else
18#define bug //
19#endif
20#define zero
21int direc[4][2]=;//
方向依次定義為右左下上
22int a[1005][1005],visited[1005][1005
],m,n;
23//
a為輸入的2維向量,visited記錄該點是否被訪問過,同時記錄轉折次數,
24//
如果新的轉折次數小於以前訪問時的次數那麼更新,否則不更新。
25struct
node 26;
32 node start,end;//
開始和結束
33void bfs()//
寬度搜尋
3449
for(int i=0;i<4;i++)//
對轉交四個方向分別進行判斷 50
65}66}
67 cout<
<
69int
main()
7088
if(!a[start.x][start.y]||!a[end.x][end.y]||(a[start.x][start.y]!=a[end.x][end.y]))89
93for(int i=1;i<=n;i++)
94for(int j=1;j<=m;j++)
95 visited[i][j]=int_max;
96bfs();97}
98}99100
return0;
101 }
再加乙個自己寫的bfs
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #includeview code11 #include 12 #include 13
using
namespace
std ;
14#ifdef debug
15#define bug assert
16#else
17#define bug //
18#endif
19#define zero
20#define maxnum 99999999
21int dir[4][2]=;
22int
n,m;
23int
i,j,k;
24int _flag=0;25
intxs,ys,x2,y2;
26int a[1001][1001]=zero;
27int visited[1001][1001]=zero;
28void dfs(int x,int y,int
di)29
41for(int i=0;i<4;i++)
4261}62
intmain()
6378}79
intt;
8081 scanf("
%d",&t);
82while(t--)
8391
}92 scanf("
%d%d%d%d
",&xs,&ys,&x2,&y2);
93if(a[xs][ys]!=a[x2][y2]||(xs==x2&&ys==y2)||!a[xs][ys]||!a[x2][y2])
9498 visited[xs][ys]=0
;99 dfs(xs,ys,-1
);100
if(_flag)
101 printf("
yes\n");
102else
103 printf("
no\n");
104}
105}
106return0;
107 }
hdu 1175 連連看(深搜)
題意 判斷兩個位置的圖案能否消除 存在不超過兩次拐彎的連線 解題過程 1 一開始開vis記錄已走過的位置,每個位置只能走一次。這樣明顯不行,因為一些拐彎超過兩次的路線會與正確的路線重合,那麼正確的路線就行不通了。2 跳出條件設定的地方錯了,導致暴棧。1 include 2 include 3 def...
搜尋 HDU1175 連連看
題目 分析 這道題看到的第一反應應該就是bfs或者dfs,裸的dfs bfs顯然會tle,所以我就想用a 不過好像並不好寫啟發函式。列舉步數不行,就列舉邊吧。因為允許有兩次轉折,所以最多有三條邊列舉中間的一條邊,然後進行check,這道題只用了兩個for迴圈就ac了。include include ...
hdu 1175 連連看 dfs搜尋
題目大意 因為是中文題,就不多說了。題目對兩塊棋子能否消除的限制為 兩者之間的連線不能轉向2次以上,並且不能穿過其他棋子.個人想法 dfs.如果能滿足題目的條件從一塊搜尋到另一塊,那麼就輸出yes,否則no。但這邊不知道為何,如果沒有在轉向兩次以後進行剪枝 接下去就只朝乙個方向走 的話,就是超時.結...