牛客 - 走迷宫(模拟+离线)
題目鏈接:點擊查看
題目大意:給出一個走迷宮的策略:
while(1){
? ? if (前面沒有障礙 && 前面還沒有走過)
? ? ? ? 前進(jìn)一步();
? ? else if(右邊沒有障礙 && 右邊還沒有走過)
? ? {
? ? ? ? 右轉(zhuǎn)();
? ? ? ? 前進(jìn)一步();
? ? }
? ? else
? ? ? ? 原地愣住();
}
這樣最后走出的迷宮一定是個越走越小的蛇形填數(shù)的那個樣子
1 2 3
8 9 4
7 6 5
現(xiàn)在給出矩陣大小n和m來表示n*m隨后給出q個詢問,詢問第幾步可以到達(dá)的位置,對于每個詢問輸出坐標(biāo)
題目分析:題目不難懂,主要是該怎么實現(xiàn),之前訓(xùn)練的時候做過一個很類似的題目,也是優(yōu)先先向前走,然后再右拐,當(dāng)時的思想感覺可以放在這題目上試試,沒想到真讓我給過了。。實現(xiàn)的話因為n和m很大,肯定不能開矩陣先模擬,只能通過縮小范圍來模擬,因為我們知道,每次走過的邊肯定是不能再走的了,優(yōu)先策略肯定是每次走一行,所以每走完一圈,整個矩陣的實際范圍就縮小了一圈,通過這樣不斷的縮小范圍來模擬就行了,對于每個查詢我們先存下來,然后離線排序,在模擬走迷宮的時候沿路把答案都更新了就行
直接看代碼好懂點,我盡量把注釋打詳細(xì)一點:
代碼:
#include<iostream> #include<cstdlib> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<cmath> #include<cctype> #include<stack> #include<queue> #include<list> #include<vector> #include<set> #include<map> #include<sstream> #include<unordered_map> using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e5+100;int n,m,q;struct query//存每個詢問 {int id,w;bool operator<(const query& a)const{return w<a.w;} }qu[N];pair<int,int>ans[N];void solve() {int left=0,right=m+1,down=n+1,up=0;//設(shè)置邊界(這里是開區(qū)間,也就是到達(dá)不了的邊界)int pos=1;//控制qu數(shù)組,也就是詢問數(shù)組的下標(biāo)int sum=0;//記錄走過的總步數(shù)int x=1,y=0;//設(shè)置起點,為了方便處理,我將起點設(shè)為(1,0)int state=0;//方向0:→ 1:↓ 2:← 3:↑while(1){if(state==0)//→ {int k=right-y-1;//步長while(pos<=q&&k+sum>=qu[pos].w)//如果當(dāng)前詢問在當(dāng)前行內(nèi){ans[qu[pos].id]=make_pair(x,y+qu[pos].w-sum);//更新答案pos++;}sum+=k;//總步數(shù)實時更新y=right-1;//更新y坐標(biāo)up++;//邊界改變}//下同,就不一一贅述了else if(state==1)//↓ {int k=down-x-1;while(pos<=q&&k+sum>=qu[pos].w){ans[qu[pos].id]=make_pair(x+qu[pos].w-sum,y);pos++;}sum+=k;x=down-1;right--;}else if(state==2)//← {int k=y-left-1;while(pos<=q&&k+sum>=qu[pos].w){ans[qu[pos].id]=make_pair(x,y-(qu[pos].w-sum));pos++;}sum+=k;y=left+1;down--;}else//↑ {int k=x-up-1;while(pos<=q&&k+sum>=qu[pos].w){ans[qu[pos].id]=make_pair(x-(qu[pos].w-sum),y);pos++;}sum+=k;x=up+1;left++;}state=(state+1)%4;//改變方向if(pos>q||sum==n*m)//若詢問查詢完畢,或遍歷完整個矩陣,退出循環(huán)break;}for(int i=pos;i<=q;i++)//更新剩余的答案ans[i]=make_pair(x,y); }int main() { // freopen("input.txt","r",stdin); // ios::sync_with_stdio(false);int w;cin>>w;while(w--){scanf("%d%d",&n,&m);int t;scanf("%d",&q);for(int i=1;i<=q;i++)//讀入詢問,離線處理{scanf("%d",&qu[i].w);qu[i].w++;qu[i].id=i;}sort(qu+1,qu+1+q);solve();for(int i=1;i<=q;i++)//直接輸出答案即可printf("(%d,%d)\n",ans[i].first,ans[i].second);}return 0; }?
總結(jié)
以上是生活随笔為你收集整理的牛客 - 走迷宫(模拟+离线)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 牛客 - 丁姐姐喜欢Fibonacci(
- 下一篇: 牛客 - 双流机场(思维)