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

P1746 离开中山路

@[栾竹清影](/user/288716) 教你个`scanf`读入字符的小技巧 ```cpp scanf("%c",&x); ``` 改为 ```cpp scanf(" %c",&x); ``` 会自动过滤之前的空格和换行符
by 童年如作业 @ 2020-04-21 10:28:52


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 lzqy_ @ 2020-04-21 10:32:06


滥用 $\LaTeX$ 差评。
by Aw顿顿 @ 2020-04-21 10:34:03


``` 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 Trinitrotoluene @ 2020-04-21 10:36:00


?这么神奇吗,我去试一下 (谢谢大佬提点)
by lzqy_ @ 2020-04-21 10:37:08


果然欸! 请问原理是什么呢?@[Trinitrotoluene](/user/141555)
by lzqy_ @ 2020-04-21 10:41:50


```cpp scanf("%c",&x); a[i][j]=(x=='0'); ``` 改成 ```cpp scanf("%1d",&x); a[i][j]=(!x); ```
by Na2PtCl6 @ 2020-04-21 10:42:28


改成 ``` 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:42:29


@[栾竹清影](/user/288716) windows 下的数据的换行符是 '/r/n',getchar() 只能读入 '/r' 而不能读入 '/n',就会导致答案错误
by Trinitrotoluene @ 2020-04-21 10:44:41


哦,就是说换行有两个符号…… 那为什么两个getchar只能拿90分呢?还有一个点是……
by lzqy_ @ 2020-04-21 10:46:54


上一页 | 下一页