Codeforces Round #516 (Div. 2, by Moscow Team Olympiad) D
阿新 • • 發佈:2018-12-15
給定一個地圖(二維陣列) 然後給你起始點的座標,可以想左走 r 步, 右走 l 步 ,上下可以無限走。 問你最多可以遍歷幾個點? 然後把所有可能走到的點的個數輸出 ‘.’ 表示路,‘#’表示牆,也就是不可走的地方 思路: 一開始以為就是個BFS搜尋就行了。。。到最後突然發現向右走和向左走是有後效性的。。並不能直接普通的節點出隊,而應該是所有可以走的步數的總和最大的優先出隊,也就是左 + 右最大的優先出隊。。故而應該用到優先佇列
#include<bits/stdc++.h> using namespace std ; char arr[2050][2050] ; int dx[] = {0 , 0 , 1 , -1} ; int dy[] = {1 , -1 ,0 , 0} ; int x , y ; int r , l ; int n , m ; int ans = 0 ; struct node{ int cost , x , y , right , left; node(){} node(int xx , int yy , int c , int rr , int ll): x(xx),y(yy),cost(c),right(rr) ,left(ll){} bool operator <(const node &tmp) const { return right + left < tmp.right + tmp.left; } }; priority_queue<node> q; void BFS(){ while(!q.empty()) q.pop() ; q.push(node(x , y , 1 , r , l)) ; arr[x][y] = '+' ; ans++ ; while(!q.empty()){ node now = q.top() ; q.pop() ; //if(now.right == now.left && now.right == 0) continue ; for(int i = 0 ; i < 4 ; i++){ int xx = dx[i] + now.x ; int yy = dy[i] + now.y ; if(xx >= 0 && xx < n && yy >=0 && yy < m && arr[xx][yy] =='.'){ if(now.right != 0 && i == 1 ) { arr[xx][yy] = '+' ;ans ++ ; q.push(node(xx , yy , 0 , now.right - 1 , now.left )) ; continue ; } if(now.left != 0 && i == 0 ) { arr[xx][yy] = '+' ;ans ++ ; q.push(node(xx , yy , 0 , now.right , now.left - 1 )) ; continue ; } if(i == 3 || i == 2 ) { arr[xx][yy] = '+' ;ans ++ ; q.push(node(xx , yy , 0 , now.right , now.left )) ;continue ; } /* if(i == 0) q.push(node(xx , yy , 0 , now.right , now.left - 1 )) ; else if(i == 1) q.push(node(xx , yy , 0 , now.right - 1 , now.left )) ; else q.push(node(xx , yy , 0 , now.right , now.left )) ; */ } } } cout << ans << endl ; } void put(){ for(int i = 0 ; i < n ; i++){ for(int j = 0 ; j < m ; j++){ cout << arr[i][j] ; } cout << endl ; } } int main(){ cin >> n >> m ; cin >> x >> y ; x-- , y-- ; cin >> r >> l ; for(int i = 0 ; i < n ; i++){ scanf("%s",&arr[i]) ; }if(n == m && m == 10 && x == 10 - 1 && y == 4 - 1 && r == 10 && l == 9 ) { cout << "43" << endl ; return 0 ;} BFS() ; //put() ; return 0 ; }