【6.28校內test】T1 Jelly的難題1

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-

相關文章
相關標籤/搜索