第七次訓練 G題

2021-09-10 06:04:36 字數 1250 閱讀 4119

問題簡述:

給出一幅地圖,已知狗的起點s,終點門d的座標,門只在時間t開啟,而狗每次移動後,以前踏過的地板便會下沉消失(即不能走重複的路),問狗能否在指定的時間t到達門。

問題分析:

此題並非求最短路徑,因此用bfs並不合適,因bfs同時向多條路徑併發,容易影響到其他路徑的方向導致答案錯誤,若不標記路徑,又容易佇列過長而tle,因此dfs會更適合該題。但光用dfs,由於其每次搜尋都會遍歷全圖的特性,會導致tle,因此需要剪枝。

第一次剪枝:當步驟數已經大於時間t時,不需要再進行搜尋

第二次剪枝:當已經找到答案時,不需要再進行搜尋

第三次剪枝比較複雜,我們先將map以0,1編號;

0 1 0 1 0 1

1 0 1 0 1 0

0 1 0 1 0 1

1 0 1 0 1 0

0 1 0 1 0 1

可見0走奇數步只能到1,走偶數步只能到0.可見四個方向行走的地圖具有「奇偶性」,其奇偶性為點座標相加對 2取餘。

因此第三次剪枝可為:當s與d的奇偶性相同時,若t為奇數,則不能走,當s與d的奇偶性不同時,若t為偶數,則也不能走。

至此問題已經解決。

#include#include#include#include#include#include#include#includeusing namespace std;

char map[10][10];

int dir[4][2]=;

bool vis[10][10];

int n,m,t;

bool flag;

bool edge(int x,int y)

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

} }}int main()

flag=0;

memset(vis,0,sizeof(vis));

int sx,sy,dx,dy;

for(int i=0;i>map[i][j];

if(map[i][j]=='s')

if(map[i][j]=='d')

} } int ps=(sx+sy)%2;

int pd=(dx+dy)%2;

int pt=t%2;

if(ps!=pd&&!pt)

else if(ps==pd&&pt)

vis[sx][sy]=1;

dfs(sx,sy,0);

if(flag)

else

}}

第七次作業

磁碟管理和維護 磁碟檔名 dev sd a p 1 128 dev hd a p 1 128 dev vd a p 1 128 heads 磁面 sectors track 扇區 cylinders磁柱 分割槽命令 fdisk dev sd 格式化 mkfs.ext4 dev sda mkfs.xf...

第七次試驗

include include include include include include using namespace std define maxsize 100 typedef char elemtype typedef struct sqqueue void initqueue sqq...

第七次作業

共有一下六步 1.客戶機提出網域名稱解析請求,並將該請求傳送給本地的網域名稱伺服器。2.當本地的網域名稱伺服器收到請求後,就先查詢本地的快取,如果有該紀錄項,則本地的網域名稱伺服器就直接把查詢的結果返回。3.如果本地的快取中沒有該紀錄,則本地網域名稱伺服器就直接把請求發給根網域名稱伺服器,然後根網域...