警示后人
  • 板块P1363 幻象迷宫
  • 楼主xduliu
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/11/22 19:56
  • 上次更新2024/11/22 21:39:20
查看原帖
警示后人
896371
xduliu楼主2024/11/22 19:56

我使用里的scanf()来读取每个字符,当遇到空格和换行符时则继续读知道为. # S,结果是5WA,其余全部TLE,但是我自己测的输出跟案例以及第一个测试点是完全一样的,于是换成cin读入每个字符,不手动筛选,直接AC了,附上前后代码,另外能有大佬解释一下这是为什么吗 前:

#include<cstdio>
#include<iostream>
using namespace std;
struct s
{
    int tt,realx,realy;
}t[1507][1507];
int n,m,dir[4][2]= {{0,-1},{-1,0},{0,1},{1,0}},ans,nowi,nowj;
char ju[1507][1507],c;
void dfs(int ii,int jj,int preii,int prejj)
{
    for(int i=0; i<4; i++)
    {
        if(ans)
            return;
        int x1=ii+dir[i][0],y1=jj+dir[i][1];
        while(x1>n)
            x1-=n;
        while(x1<=0)
            x1+=n;
        while(y1>m)
            y1-=m;
        while(y1<=0)
            y1+=m;//printf("现在探索到%d %d探索点真实坐标为%d %d 目前点真实坐标为%d %d 前一点真实坐标为%d %d\n",x1,y1,ii+dir[i][0],jj+dir[i][1],ii,jj,preii,prejj);            
        if(ju[x1][y1]!='#')
        {
            if(t[x1][y1].tt==1&&(t[x1][y1].realx!=ii+dir[i][0]||t[x1][y1].realy!=jj+dir[i][1]))
            {//printf("能重新抵达%d %d 真实坐标%d %d成功\n",x1,y1,ii+dir[i][0],jj+dir[i][1]);
                ans=1;
                return;
            }
            if(!t[x1][y1].tt)
            {
                t[x1][y1].tt++;//printf("记录%d %d已走过\n",x1,y1);
                t[x1][y1].realx=ii+dir[i][0],t[x1][y1].realy=jj+dir[i][1];
                dfs(ii+dir[i][0],jj+dir[i][1],ii,jj);
            }
        }
    }
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {//printf("读入n:%d m:%d\n",n,m);
        ans=0;
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=m; j++)
            {
                t[i][j].tt=0;  
                do
                scanf("%c",&ju[i][j]);
                while(ju[i][j]==' '||ju[i][j]=='\n');//printf("in:%c ",ju[i][j]);
                if(ju[i][j]=='S')
                    nowi=i,nowj=j;
            }//printf("\n");
        }//printf("此时t为\n");for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)printf("%d ",t[i][j]);printf("\n");}
        t[nowi][nowj].tt++;
        t[nowi][nowj].realx=nowi,t[nowi][nowj].realy=nowj;
        dfs(nowi,nowj,-99,-99);
        if(ans)
            printf("Yes\n",ans);
        else
            printf("No\n",ans);
    }
    return 0;
}

AC:

#include<cstdio>
#include<iostream>
using namespace std;
struct s
{
    int tt,realx,realy;
}t[1507][1507];
int n,m,dir[4][2]= {{0,-1},{-1,0},{0,1},{1,0}},ans,nowi,nowj;
char ju[1507][1507],c;
void dfs(int ii,int jj,int preii,int prejj)
{
    for(int i=0; i<4; i++)
    {
        if(ans)
            return;
        int x1=ii+dir[i][0],y1=jj+dir[i][1];
        while(x1>n)
            x1-=n;
        while(x1<=0)
            x1+=n;
        while(y1>m)
            y1-=m;
        while(y1<=0)
            y1+=m;//printf("现在探索到%d %d探索点真实坐标为%d %d 目前点真实坐标为%d %d 前一点真实坐标为%d %d\n",x1,y1,ii+dir[i][0],jj+dir[i][1],ii,jj,preii,prejj);            
        if(ju[x1][y1]!='#')
        {
            if(t[x1][y1].tt==1&&(t[x1][y1].realx!=ii+dir[i][0]||t[x1][y1].realy!=jj+dir[i][1]))
            {//printf("能重新抵达%d %d 真实坐标%d %d成功\n",x1,y1,ii+dir[i][0],jj+dir[i][1]);
                ans=1;
                return;
            }
            if(!t[x1][y1].tt)
            {
                t[x1][y1].tt++;//printf("记录%d %d已走过\n",x1,y1);
                t[x1][y1].realx=ii+dir[i][0],t[x1][y1].realy=jj+dir[i][1];
                dfs(ii+dir[i][0],jj+dir[i][1],ii,jj);
            }
        }
    }
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {//printf("读入n:%d m:%d\n",n,m);
        ans=0;
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=m; j++)
            {
                t[i][j].tt=0;  
                cin>>ju[i][j];
                if(ju[i][j]=='S')
                    nowi=i,nowj=j;
            }//printf("\n");
        }//printf("此时t为\n");for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)printf("%d ",t[i][j]);printf("\n");}
        t[nowi][nowj].tt++;
        t[nowi][nowj].realx=nowi,t[nowi][nowj].realy=nowj;
        dfs(nowi,nowj,-99,-99);
        if(ans)
            printf("Yes\n",ans);
        else
            printf("No\n",ans);
    }
    return 0;
}
2024/11/22 19:56
加载中...