HDU1175 連連看 不好寫

2022-02-15 17:58:46 字數 1761 閱讀 2064

ps:這一題也是寫了二十多遍了,去年這個時候寫的,也是寫了幾天。過幾天等考試結束了,集訓的時候重新把幾種方法再寫一下!

題意:中文題,自行理解。

思路:三維+優先佇列寫的,跑的時間是最短的,780ms。

dfs+剪枝+判斷方向是否改變。跑了辣麼長時間6895ms。

ps:flag標記判斷方向就行了。

三維+優先佇列寫的,跑的時間是最短的,780ms。

//三維+優先佇列

#include#include#includeusing namespace std;

int aaa[1100][1100];

int book[1100][1100][4];

int aa,bb,cc,dd;

int flag;

int n,m;

int dir[4][2]= ,,,};

struct node

else

continue;

}else

}if(p.x==cc&&p.y==dd&&p.step<=3)

q.push(p);

// q.push(p);}}

}return ;

}int main()

}int ss;

scanf("%d",&ss);

while(ss--)

bfs(aa,bb,cc,dd);

if(flag==0)

printf("no\n");

else

printf("yes\n");}}

return 0;

}

dfs+剪枝+判斷方向是否改變:

#include#include#define inf 0x3f3f3f3f

int a[1100][1100];

int book[1100][1100];

int flag,step,k;

int n,m;

int aa,bb,cc,dd;

int dir[4][2]= ,,,};

void dfs(int x1,int y1,int to,int step)

}int face;//判斷轉彎次數

for(int i=0; i<4; i++)

else

book[tx][ty]=1;

dfs(tx,ty,i,face);//遞迴不是to,是上次走的那個方向也就是i

//第一次搜的時候第三個位置是to,因為要保證第乙個step++

book[tx][ty]=0;//取標}}

return;

}int main()

int ss;

scanf("%d",&ss);

for(int i=0; i// book[aa][bb]=1;

//-1判斷方向是否改變

k=0;

dfs(aa,bb,-1,0);//只能去傳入方向是否改變和轉彎次數,不能傳入座標(無法記錄方向是否改變)

//只有第一次傳入-1,之後傳入的都是記錄上一次的方向i

if(k==1)

printf("yes\n");

if(k==0)

printf("no\n");}}

return 0;

}//4 4

//1 2 3 4

//0 0 0 0

//4 3 1 0

//0 0 1 0

//1//1 1 4 3

搜尋 HDU1175 連連看

題目 分析 這道題看到的第一反應應該就是bfs或者dfs,裸的dfs bfs顯然會tle,所以我就想用a 不過好像並不好寫啟發函式。列舉步數不行,就列舉邊吧。因為允許有兩次轉折,所以最多有三條邊列舉中間的一條邊,然後進行check,這道題只用了兩個for迴圈就ac了。include include ...

hdu 1175 連連看 dfs搜尋

題目大意 因為是中文題,就不多說了。題目對兩塊棋子能否消除的限制為 兩者之間的連線不能轉向2次以上,並且不能穿過其他棋子.個人想法 dfs.如果能滿足題目的條件從一塊搜尋到另一塊,那麼就輸出yes,否則no。但這邊不知道為何,如果沒有在轉向兩次以後進行剪枝 接下去就只朝乙個方向走 的話,就是超時.結...

HDU 1175 連連看 DFS 剪枝

題目大意 連連看,中文題就不解釋了!解題思路 好坑的題呀,除錯了我n多個小時,怎麼都不對,後邊各種中間結果輸出都用上了,交上去一直wa。早上過來重新寫了一次,居然a了。完全不能理解呀!說下這個題吧,主要是對各個條件的剪枝上,其它都很簡單。在剪枝上的分析就不具體說了,給了很詳細的注釋了,各種細節注意就...