Jelly的難題【題目連接】node
廢話一句:今天中考出成績,感受你們考的都超級棒,無論怎樣,願你們成爲最好的本身。c++
好了廢話完了,下面是題解部分:算法
SOLUTION:函數
首先你可能發生的,是看不懂題:spa
定睛一看,這是個廣搜!(而後很是幸運昨天剛作了一個廣搜的題,而後我就會了)code
首先先是輸入部分,這個真的很毒瘤了,當sy已經去忙akT1的時候,我還在可憐的與讀入做鬥爭(與讀入抗爭掉了大部分時間可還行)。讀入很毒瘤,由於每一個字符之間有空格,因此讀入的時候要用while過濾。而後咱的讀入好生毒瘤,看看就好啦(相信像ych這樣的大佬確定有更優的方法):blog
n=read();m=read(); char ch=getchar(); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ while(ch==' '||ch=='\n'||ch=='\r') ch=getchar(); a1[i][j]=ch; if(a1[i][j]=='*') x=i,y=j,a[i][j]=2; if(a1[i][j]=='#') a[i][j]=0; if(a1[i][j]=='o') a[i][j]=1; ch=getchar(); } }
而後就是bfs部分了,其實就是一個標準的廣搜板子,而後由於最近看了tarjan,我竟然在bfs裏用了時間戳可海星。隊列
首先要說一直理解不了構造函數這種東西,因此一直都是寫賦值函數,看看就好。get
首先顯然是把*(也就是打印機)的地方加進隊列中,而後別忘記開vis記錄已經走過了。it
而後while(!q.empty()),每次取出隊首,向四個方向擴展(固然前提是能夠擴展所以記得寫pan函數),而後對於最大時間以及卷子數量,我用了時間的理念,也就是記錄訪問順序(固然並非徹底時間戳),進行儲存與bfs,每次取出隊首,而後四個方向嘗試拓展,若是能夠拓展,那麼拓展,將其入隊,並將新入隊的結點的dfn值在被拓展出的結點的基礎上+1,這樣最大的dfn也就是最大的時間ans。而後還有如何算總共的卷子數,個人算法比較複雜,感受過於麻煩了(看看就好啦),記錄每一個時間戳,而後用ans-時間戳+1,表示的就是這個結點的卷子數。而後加起來就好啦。
#include<bits/stdc++.h> using namespace std; inline int read(){ int ans=0; char last,ch=getchar(); while(ch<'0'||ch>'9') last=ch,ch=getchar(); while(ch>='0'&&ch<='9') ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar(); if(last=='-') ans=-ans; return ans; } int n,m,x,y; int a[501][501]; int dx[4]={1,-1,0,0}; int dy[4]={0,0,-1,1}; char a1[501][501]; bool vis[501][501]; const int mod=19260817; struct node{ int x,y,dfn; }; node fz(int x,int y,int dfn){ node rtn; rtn.x=x; rtn.y=y; rtn.dfn=dfn; return rtn; } bool pan(int x,int y){//判斷函數,保證行走合法 return x>=1&&y>=1&&x<=n&&y<=m&&vis[x][y]==0&&a[x][y]==0; } queue<node> q; void bfs(){ q.push(fz(x,y,0)); vis[x][y]=1; int ans=0,sum=0; int cnt=0,cz[300000]; while(!q.empty()){ node h=q.front(); cz[++cnt]=h.dfn%mod; q.pop(); for(int i=0;i<4;i++){ int xx=h.x,yy=h.y,dfnn=h.dfn; if(pan(xx+dx[i],yy+dy[i])){ xx+=dx[i];yy+=dy[i]; q.push(fz(xx,yy,dfnn+1)); vis[xx][yy]=1; if(dfnn+1>ans) ans=dfnn+1; } } } for(int i=2;i<=cnt;i++)//我太菜了的求卷子數法qwq sum=(sum%mod+ans%mod-cz[i]%mod+1)%mod; cout<<ans<<endl<<sum<<endl; } int main(){ n=read();m=read(); char ch=getchar(); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ while(ch==' '||ch=='\n'||ch=='\r') ch=getchar(); a1[i][j]=ch; if(a1[i][j]=='*') x=i,y=j,a[i][j]=2; if(a1[i][j]=='#') a[i][j]=0; if(a1[i][j]=='o') a[i][j]=1; ch=getchar(); } } bfs(); return 0; }
end-