廣搜+位運算:
在這裡我們建立乙個2進製鑰匙串,如果對應位有鑰匙則該位為1,反之為0,每當遇見鑰匙,我們就把這把這把鑰匙加到鑰匙串的對應位置,廣搜壓棧的時候需要判斷該位置是否為門的位置,並且檢查是否有相應的鑰匙,並且每個點對應乙個鑰匙串的狀態,建立三維陣列,前兩位表示儲存點的位置,後一位表示相應位置對應的鑰匙的狀態,進行一遍bfs即可。
#includeint m,n,t;
char map[21][21];
int dir_x[4]=;
int dir_y[4]=;
int find[21][21][1025];
int f[10000],a[10000],b[10000],bsu[10000];
int start_x,start_y,end_x,end_y;
int bfs(int x,int y)
else
j=f[front];
if('a'<=map[xx][yy]&&map[xx][yy]<='j')
else
k=1;
if(1<=xx&&xx<=m&&1<=yy&&yy<=n&&map[xx][yy]!='*'&&k==1)
if(find[xx][yy][1024]==0||(find[xx][yy][1024]==1&&find[xx][yy][j]==0))
}front++;
}return -1;
}
int main()
if(map[i][j]=='^')
for(int k=0;k<=1023;k++)
find[i][j][k]=0;
}getchar();
}printf("%d\n",bfs(start_x,start_y));
}return 0;
}
HDU1429 勝利大逃亡 續
學習位壓縮很好的一道題,因為只有10把鑰匙,那麼可以把10鑰匙壓縮二進位制,比如1000就表示身上只要第4把鑰匙的狀態,110表示帶有第2把和第3把鑰匙,那麼要判斷當前的鑰匙串有沒有能開啟當前門鑰匙,那麼就只要乙個 運算就可以,因為11101110 00100000 00100000 這樣就說明那一...
hdu 1429 勝利大逃亡 續
code include include using namespace std struct px struct px start char map 25 25 int mark 25 25 1025 dir 4 2 三維表,走過的路徑對應表的狀態 int wys 10 int n,m,t boo...
hdu 1429勝利大逃亡 續
題目 一開始想了好幾種方法。最後實驗都錯了。要麼是就是演算法思想錯誤。然後以為可以這樣。果斷。記憶體超出。下面是錯誤 include include includeusing namespace std define n 21 int n,m,t char map n n bool visited ...