生活随笔
收集整理的這篇文章主要介紹了
迷阵
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
迷陣
牛客網 題目鏈接
思路:
二分+寬搜
最小是0 ,最大是3000
二分出mid
for循環i+mid來找答案
寬搜中最小值為1 ,最大值為i+mid
寬搜:從1 , 1 開始搜索
可以走的并且沒有走過的加到queue中
如果可以走到終點,返回true,即這個mid是符合答案的
將ans更新為mid,同時將最大值更新為mid
如果不可以,把最小值更新為mid+ 1
#include <bits/stdc++.h>
using namespace std;typedef pair<int , int >PII;
const int N = 110;
int all[N][N];
int ok[N][N];
int n ;
int dx[]= {-1 , 0 ,1 , 0} , dy[] = {0 , 1 , 0 , -1} ;//坐標偏移量bool check(int l , int r)
{memset(ok , 0 , sizeof ok);queue<PII> p;p.push({1, 1});ok[1][1] = 1 ;while(p.size()){auto t = p.front();p.pop();int x = t.first , y = t.second;if(x + y == 2 * n ) return true ;//如果可以走到for(int i = 0 ; i < 4 ;i ++){int x1 = x + dx[i] , y1= y + dy[i];if(x1 < 1 || x1 > n || y1 < 1 || y1 > n ) continue;//如果點出界if(ok[x1][y1] == 1) continue;//走過if(l > all[x1][y1] || all[x1][y1]> r) continue;//比最大值大,比最小值小ok[x1][y1] = 1;p.push({x1 , y1});}}return false;}int main()
{cin>>n;for(int i = 1 ; i <= n ; i ++){for(int j = 1 ; j <= n ; j ++){cin>>all[i][j];}}int ans = 1e9;int l = 0 , r = 3000;while(l < r){int mid = l + r >>1 ;int o = 0 ;for(int i = 0 ; i <= 3000 -mid ; i ++){int a = i , b = i + mid ;if(a > all[1][1] || b < all[1][1]) continue;//判斷1 , 1 這個點能不能走if(check(a , b ))//判斷{o = 1 ;break;}}if(o == 1 ) {ans = mid;r = mid;}else l = mid + 1 ;}cout<<ans;return 0;
}
總結
以上是生活随笔為你收集整理的迷阵的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。