noj Nightmare
生活随笔
收集整理的這篇文章主要介紹了
noj Nightmare
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
點擊打開鏈接但是推薦你看看這個博客寫的太好的這道題
原題連接
今天終于改了很久把這個題給弄好了~就是有一個問題不明白~就是標記問題,但是這里標記不是按它是否訪問夠來做標準來標記它而是看它訪問時所剩的時間來分,因為它會往回走,剩下的時間越多越好,在這里因為它數據不是很大,所以我就不寫標記的事了,。
這個題就是迷宮的感覺但是第一步就是找出從哪里開始,所以用一個結構體來記下開始點,
#include<stdio.h> #include<string.h> #include<queue> int a[70][70],n,m; int movex[4]={-1,1,0,0}; int movey[4]={0,0,-1,1}; using namespace std; struct app {int x,y,time;int mark; }S[10]; int main() {int t;scanf("%d",&t);while(t--){ int stratx,straty;scanf("%d%d",&n,&m);memset(a,0,sizeof(a));memset(S,0,sizeof(S));for(int i=0;i<n;i++)for(int j=0;j<m;j++) {scanf("%d",&a[i][j]);if(a[i][j]==2){S[0].x=i;S[0].y=j;S[0].time=6;S[0].mark=0; //記下走到這一步用的時間,不能用time 來記錄因為你不知道什么time重新被設置成6}}//把迷宮的布局存在二維數組里,并且標記下開始的點。queue<app> q;int flag=0;while(!q.empty()) q.pop();q.push(S[0]);while(!q.empty()){S[1]=q.front();q.pop();if(a[S[1].x][S[1].y]==3){if(S[1].time>0)printf("%d\n",S[1].mark);elseputs("-1");flag=1;break;}if(a[S[1].x][S[1].y]==4){S[1].time=6;a[S[1].x][S[1].y]=0;}for(int i=0;i<4;i++){S[2].x=S[1].x+movex[i]; //這種方法比較好,用來代替四個方向。S[2].y=S[1].y+movey[i];S[2].time=S[1].time-1; S[2].mark=S[1].mark+1;if(S[2].x<0||S[2].x>n||S[2].y<0||S[2].y>m)continue;if(a[S[2].x][S[2].y]==0)continue;if(S[2].time<=0)continue;q.push(S[2]);}}if(!flag)puts("-1");}return 0; }總結
以上是生活随笔為你收集整理的noj Nightmare的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: noj 邮票分你一半z的生日
- 下一篇: 字符串周期--hdu 3746 Cycl