虽然已经通过了,但还是想说一下

P1746 离开中山路

lzqy_ @ 2020-04-21 10:16:53

已经是第n次了,scanf大红大紫,换成cin就AC了

是评测机的锅还是scanf锅啊…QwQ


by 童年如作业 @ 2020-04-21 10:28:52

@栾竹清影 教你个scanf读入字符的小技巧

scanf("%c",&x);

改为

scanf(" %c",&x);

会自动过滤之前的空格和换行符


by lzqy_ @ 2020-04-21 10:32:06

AC代码:

#include <bits/stdc++.h>
using namespace std;

struct p
{
  int x,y;
} W,M;
queue<p>q;
int a[1001][1001];
bool k[10000][10000];
int p[4][2]= {{1,0},{0,1},{-1,0},{0,-1}};
void BFS()
{
  int len=1,ans=0;
  while(!q.empty())
  {
    for(int i=0; i<len; i++)
    {
      if(q.front().x==W.x&&q.front().y==W.y)
      {
        printf("%d",ans);
        return ;
      }
      for(int i=0; i<4; i++)
      {
        if(a[q.front().x+p[i][0]][q.front().y+p[i][1]]&&!k[q.front().x+p[i][0]][q.front().y+p[i][1]])
        {
          M.x=q.front().x+p[i][0];
          M.y=q.front().y+p[i][1];
          q.push(M);
          k[M.x][M.y]=1;
        }
      }
      q.pop();
    }
    ans++;
    len=q.size();
  }
}
int main()
{
  int n;
  char x;
  cin>>n;
  getchar();
  for(int i=1; i<=n; i++)
  {
    for(int j=1; j<=n; j++)
    {
      cin>>x;
      a[i][j]=(x=='0');
    }
    getchar();
  }
  cin>>M.x>>M.y>>W.x>>W.y;
  q.push(M);
  k[M.x][M.y]=1;
  BFS();
  return 0;
}

8WA两RE代码:

#include <bits/stdc++.h>
using namespace std;

struct p
{
  int x,y;
} W,M;
queue<p>q;
int a[1001][1001];
bool k[10000][10000];
int p[4][2]= {{1,0},{0,1},{-1,0},{0,-1}};
void BFS()
{
  int len=1,ans=0;
  while(!q.empty())
  {
    for(int i=0; i<len; i++)
    {
      if(q.front().x==W.x&&q.front().y==W.y)
      {
        printf("%d",ans);
        return ;
      }
      for(int i=0; i<4; i++)
      {
        if(a[q.front().x+p[i][0]][q.front().y+p[i][1]]&&!k[q.front().x+p[i][0]][q.front().y+p[i][1]])
        {
          M.x=q.front().x+p[i][0];
          M.y=q.front().y+p[i][1];
          q.push(M);
          k[M.x][M.y]=1;
        }
      }
      q.pop();
    }
    ans++;
    len=q.size();
  }
}
int main()
{
  int n;
  char x;
  scanf("%d",&n);
  getchar();
  for(int i=1; i<=n; i++)
  {
    for(int j=1; j<=n; j++)
    {
      scanf("%c",&x);
      a[i][j]=(x=='0');
    }
    getchar();
  }
  scanf("%d%d%d%d",&M.x,&M.y,&W.x,&W.y);
  q.push(M);
  k[M.x][M.y]=1;
  BFS();
  return 0;
}

抱歉抱歉忘记放代码了QwQ

只有中间的读入有区别…


by Aw顿顿 @ 2020-04-21 10:34:03

滥用 \LaTeX 差评。


by Trinitrotoluene @ 2020-04-21 10:36:00

for(int i=1; i<=n; i++)
  {
    for(int j=1; j<=n; j++)
    {
      scanf("%c",&x);
      a[i][j]=(x=='0');
    }
    getchar();
  }

改成

for(int i=1; i<=n; i++)
  {
    scanf("%s",x);
    for(int j=1; j<=n; j++)
    {
      a[i][j]=(x[j-1]=='0');
    }
  }

就可以AC了


by lzqy_ @ 2020-04-21 10:37:08

?这么神奇吗,我去试一下

(谢谢大佬提点)


by lzqy_ @ 2020-04-21 10:41:50

果然欸!

请问原理是什么呢?@Trinitrotoluene


by Na2PtCl6 @ 2020-04-21 10:42:28

scanf("%c",&x);
a[i][j]=(x=='0');

改成

scanf("%1d",&x);
a[i][j]=(!x);

by Trinitrotoluene @ 2020-04-21 10:42:29

改成

for(int i=1; i<=n; i++)
  {
    for(int j=1; j<=n; j++)
    {
      scanf("%c",&x);
      a[i][j]=(x=='0');
    }
    getchar();getchar();
  }

也可对9个点


by Trinitrotoluene @ 2020-04-21 10:44:41

@栾竹清影 windows 下的数据的换行符是 '/r/n',getchar() 只能读入 '/r' 而不能读入 '/n',就会导致答案错误


by lzqy_ @ 2020-04-21 10:46:54

哦,就是说换行有两个符号……

那为什么两个getchar只能拿90分呢?还有一个点是……


上一页 | 下一页