HDU

来源:互联网 发布:qq三国白菜数据 编辑:程序博客网 时间:2024/05/17 08:52


这个题目

题意有问题。按道理说在T时刻到达,奇偶剪枝后的情况是符合的,,,,突然想到,他似乎是可以停的;莫不是因为这。。。。

样例:

15 5 14S*#*..#........****....#...*.P#.*..***.....*.*.#..outputYES

用的dfs超时了,然后剪枝之后就wa了



不过最大的wa点在于,#之后的传送,cnt应该也是+1的,因为他是 从前一步挪过来的;而我一直没有加1

就是错在了这里;


有一个注意点就是#  和# 之间的传送,出现这种情况是错误的



bfs的代码。。。这么一个水题。。。补了一下午吐血

#include <iostream>#include<cstring>#include<string>#include<set>#include<map>#include<queue>#include<algorithm>using namespace std;const int maxn=15;char mp[3][maxn][maxn];char down[maxn][maxn];int xx0,yy0;int xxn,yyn;int m,n;int t;int dx[]={0,0,-1,1};int dy[]={1,-1,0,0};int flag;struct node{    int x,y,z;    int t;    node(int xx=0,int yy=0,int zz=0,int tt=0)    {        x=xx;y=yy;z=zz;t=tt;    }};int vis[3][maxn][maxn];void bfs(){    vis[0][xx0][yy0]=1;    queue<node> q;    q.push(node(xx0,yy0,0,0));    while(q.size())    {        if(flag)            return;        node a=q.front();q.pop();       // cout<<" a="<<a.z<<" "<<a.x<<" "<<a.y<<endl;        if(a.t+1>t)            continue;        for(int i=0;i<4;i++)        {            int xx=a.x+dx[i],yy=a.y+dy[i];            if(xx>=0&&yy>=0&&xx<n&&yy<m&&mp[a.z][xx][yy]!='*'&&!vis[a.z][xx][yy])            {                vis[a.z][xx][yy]=1;                if(mp[a.z][xx][yy]=='.')                {                    q.push(node(xx,yy,a.z,a.t+1));                }               else if(mp[a.z][xx][yy]=='#')               {                   if(mp[(a.z+1)%2][xx][yy]=='.'&&!vis[(a.z+1)%2][xx][yy])                   {                       vis[(a.z+1)%2][xx][yy]=1;                       q.push(node(xx,yy,(a.z+1)%2,a.t+1));                   }                  else  if(mp[(a.z+1)%2][xx][yy]=='P')                  {                      if(a.t+1<=t)                      {                          flag=1;                          return ;                      }                  }               }               else if(mp[a.z][xx][yy]=='P')               { //cout<<" ss"<<endl;                   if(a.t+1<=t)                   {                       flag=1;                       return;                   }               }            }        }    }}int main(){    int T;    cin>>T;    while(T--)    {         memset(vis,0,sizeof(vis));        flag=0;        cin>>n>>m>>t;        for(int i=0;i<n;i++)            for(int j=0;j<m;j++)        {            cin>>mp[0][i][j];            if(mp[0][i][j]=='S')            {                xx0=i;yy0=j;            }        }        for(int i=0;i<n;i++)            for(int j=0;j<m;j++)        {            cin>>mp[1][i][j];            if(mp[1][i][j]=='P')            {                xxn=i;yyn=j;            }        }        bfs();       if(flag)        cout<<"YES"<<endl;       else        cout<<"NO"<<endl;    }   // cout << "Hello world!" << endl;    return 0;}


,哦,莫名其妙的dfs......

暂时不想改了

#include <iostream>#include<cstring>#include<string>#include<set>#include<map>#include<queue>#include<algorithm>using namespace std;const int maxn=15;char up[maxn][maxn];char down[maxn][maxn];int xx0,yy0;int xxn,yyn;int m,n;int t;int dx[]={0,0,-1,1};int dy[]={1,-1,0,0};int flag;int vis1[maxn][maxn];int vis2[maxn][maxn];int ABS(int x) {return x<0?-x:x;}void dfs(int x,int y,int z,int cnt){    //cout<<x<<" "<<y<<endl;    if(flag)        return;    if(x==xxn&&y==yyn&&z==-1)    {       // cout<<cnt<<endl;        if(cnt<=t)        {            flag=1;            return ;        }        else            return ;    }    if(cnt>t)    { // cout<<x<<" "<<y<<" "<<z<<endl;        return;    }  int remain=ABS(x-xxn)+ABS(y-yyn)-ABS(cnt-t);    if(remain>0||remain&1)        return;    for(int i=0;i<4;i++)    {        int xx=x+dx[i],yy=y+dy[i];        if(flag)            return ;        if(z==1)        {             if(xx>=0&&yy>=0&&xx<n&&yy<m&&up[xx][yy]!='*'&&!vis1[xx][yy])           {             //cout<<xx<<" "<<yy<<" u p"<<endl;             vis1[xx][yy]=1;            if(up[xx][yy]=='.')            {                dfs(xx,yy,1,cnt+1);            }            else if(up[xx][yy]=='#')            {                if(down[xx][yy]=='.')                {                    vis2[xx][yy]=1;                    dfs(xx,yy,-1,cnt+1);                    vis2[xx][yy]=0;                }                else if(down[xx][yy]=='P')                {                    if(cnt<=t)                  {                    flag=1;                    return ;                  }                  return;                }            }           vis1[xx][yy]=0;           }        }        else        {             if(xx>=0&&yy>=0&&xx<n&&yy<m&&down[xx][yy]!='*'&&!vis2[xx][yy])           {                 vis2[xx][yy]=1;              if(down[xx][yy]=='.')             {                dfs(xx,yy,-1,cnt+1);             }             else if(down[xx][yy]=='P')             {                 //cout<<cnt<<endl;                if(cnt<=t)                {                    flag=1;                    return ;                }                else                    return;             }             else if(down[xx][yy]=='#')             {                 if(up[xx][yy]=='.')                 {                      vis1[xx][yy]=1;                      dfs(xx,yy,1,cnt+1);                      vis1[xx][yy]=0;                 }             }              vis2[xx][yy]=0;          }        }    }}int main(){    int T;    cin>>T;    while(T--)    {        memset(vis1,0,sizeof(vis1));        memset(vis2,0,sizeof(vis2));        flag=0;        cin>>n>>m>>t;        for(int i=0;i<n;i++)            for(int j=0;j<m;j++)        {            cin>>up[i][j];            if(up[i][j]=='S')            {                xx0=i;yy0=j;            }        }        for(int i=0;i<n;i++)            for(int j=0;j<m;j++)        {            cin>>down[i][j];            if(down[i][j]=='P')            {                xxn=i;yyn=j;            }        }       if(flag)        cout<<"YES"<<endl;       else        cout<<"NO"<<endl;    }   // cout << "Hello world!" << endl;    return 0;}
水题不会,,难题不会。。。我怕是要死了


原创粉丝点击