我使用里的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;
}