15nod1572-模拟&前缀和&枚举-宝岛地图

来源:互联网 发布:3d studio max mac版 编辑:程序博客网 时间:2024/06/10 04:18

https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1572
中文题意,恕不赘述。
枚举每个点dfs的时候t了。开始每看懂题意。以为只要判断转折点就行了,后来发现只要再点到点的过程种也不能有#出现qwq
技巧:为了避免再转折的时候再判断路径种的点,维护一下方向的前缀和。然后再搞就好了, 枚举是1e6,轻轻松松就可以达到。
注:我枚举的是包括自身的,计算的时候都应该-1再弄。

#include <bits/stdc++.h>using namespace std;const int maxn=1e3+20;int nor[maxn][maxn];int sou[maxn][maxn];int eas[maxn][maxn];int wes[maxn][maxn];char a[maxn][maxn];int m,n;bool flag;vector<pair<char,int> >p;vector<char>q;void dfs(int i,int j,int siz){     if(siz==p.size())     {   flag=true;        //puts("!!!!!");          return ;     }     if(p[siz].first=='N'){        if((nor[i][j]-1)>=p[siz].second){            dfs(i-p[siz].second,j,siz+1);        }     }     else if(p[siz].first=='S'){        if((sou[i][j]-1)>=p[siz].second)            dfs(i+p[siz].second,j,siz+1);            //cout<<i<<" "<<j<<p[siz].second<<endl;     }      else if(p[siz].first=='W'){        if((wes[i][j]-1)>=p[siz].second)            dfs(i,j-p[siz].second,siz+1);            //cout<<i<<" "<<j<<p[siz].second<<endl;      }      else if(p[siz].first=='E'){        if((eas[i][j]-1)>=p[siz].second)            dfs(i,j+p[siz].second,siz+1);            //cout<<i<<" "<<j<<p[siz].second<<endl;     }}int main(){   while(~scanf("%d%d",&m,&n)){          for(int i=1;i<=m;i++){              for(int j=1;j<=n;j++)                  cin>>a[i][j];          }          memset(sou,0,sizeof(sou));          for(int i=m;i>=1;i--){              for(int j=1;j<=n;j++){                    if(a[i][j]!='#')                       sou[i][j]=sou[i+1][j]+1;                    else                        sou[i][j]=0;              }          }          memset(nor,0,sizeof(nor));          for(int i=1;i<=m;i++){             for(int j=1;j<=n;j++){                 if(a[i][j]!='#')                    nor[i][j]=nor[i-1][j]+1;                 else                    nor[i][j]=0;             }          }          memset(eas,0,sizeof(eas));          for(int i=1;i<=m;i++){              for(int j=n;j>=1;j--)                 if(a[i][j]!='#')                    eas[i][j]=eas[i][j+1]+1;                 else                    eas[i][j]=0;          }          memset(wes,0,sizeof(wes));          for(int i=1;i<=m;i++){              for(int j=1;j<=n;j++)                 if(a[i][j]!='#')                    wes[i][j]=wes[i][j-1]+1;                 else                    wes[i][j]=0;          }          //cout<<sou[2][4]<<endl;          /*for(int i=1;i<=m;i++){             for(int j=1;j<=n;j++){                  if(a[i][j]>='A'&&a[i][j]<='Z')                     printf("%c %d %d %d %d\n",a[i][j],nor[i][j],sou[i][j],wes[i][j],eas[i][j]);             }          }*/          int num1;          cin>>num1;          p.clear();          int num2;char cha;          for(int i=0;i<num1;i++){             cin>>cha>>num2;             p.push_back(make_pair(cha,num2));          }          //cout<<"**"<<endl;          q.clear();          for(int i=1;i<=m;i++){             for(int j=1;j<=n;j++){                 if(a[i][j]>='A'&&a[i][j]<='Z'){                     flag=false;                     //cout<<a[i][j]<<endl;                     dfs(i,j,0);                     if(flag)                        q.push_back(a[i][j]);                 }             }          }          sort(q.begin(),q.end());          if(q.size()!=0){          for(int i=0;i<q.size();i++){              printf("%c",q[i]);          }          cout<<endl;          }          else            puts("no solution");    }    return 0;}

附赠tle版本
看着就不像能a的。。只是想rush一下

#include <bits/stdc++.h>using namespace std;const int maxn=1e3+200;char s[maxn][maxn];int m,n;int fx[4][2]={{1,0},{-1,0},{0,1},{0,-1}};vector<pair<char,int> >q;vector<char>re;int flag;void dfs(int x,int y,int siz){     if(flag!=-1) return;     if(x>m||x<1||y>n||y<1)       {flag=0;       //cout<<"**"<<endl;       return;}      if(siz==q.size()&&(s[x][y]=='.'||(s[x][y]>='A'&&s[x][y]<='Z'))){          flag=1;return;      }      if(q[siz].first=='N'){         for(int i=0;i<=q[siz].second;i++)            if(s[x-i][y]=='#'||x-i<1){flag=0;            //cout<<s[x-i][y]<<" "<<i<<endl;            //cout<<"n"<<endl;            break;}            dfs(x-q[siz].second,y,siz+1);         }      else if(q[siz].first=='S'){          for(int i=0;i<=q[siz].second;i++)            if(s[x+i][y]=='#'||x+i>m){flag=0;            //cout<<"s"<<endl;            break;}          dfs(x+q[siz].second,y,siz+1);          }      else if(q[siz].first=='W'){          for(int i=0;i<=q[siz].second;i++)            if(s[x][y-i]=='#'||y-i<1){flag=0;            //cout<<"w"<<endl;            break;}          dfs(x,y-q[siz].second,siz+1);          }      else{          for(int i=0;i<=q[siz].second;i++)            if(s[x][y+i]=='#'||y+i>n){flag=0;              //cout<<s[x+i][y]<<" "<<x<<endl;            //cout<<"e"<<endl;break;            }          dfs(x,y+q[siz].second,siz+1);      } }int main(){   while(cin>>m>>n){          re.clear();          q.clear();          for(int i=1;i<=m;i++){              for(int j=1;j<=n;j++){                 cin>>s[i][j];              }          }          int num;          cin>>num;          char cha;int num1;          for(int i=1;i<=num;i++){             cin>>cha>>num1;             q.push_back(make_pair(cha,num1));          }          //reverse(q.begin(),q.end());          for(int i=1;i<=m;i++){              for(int j=1;j<=n;j++){                  if(s[i][j]>='A'&&s[i][j]<='Z')                  {  flag=-1;                      dfs(i,j,0);                      //if(s[i][j]=='A')                        //cout<<flag<<"!!"<<endl;                      if(flag==1)                        re.push_back(s[i][j]);                  }              }          }          sort(re.begin(),re.end());          if(re.size()!=0){              //printf("%d\n",re.size());              for(int i=0;i<re.size();i++){                  printf("%c",re[i]);              }              cout<<endl;          }          else            puts("no solution");}    return 0;}