【发布时间】:2018-02-06 14:11:01
【问题描述】:
目前,当我尝试将值分配给数组时,我在memset 和 for 循环之间遇到了问题。当我尝试用 for 循环替换 memset 时,我的程序的输出有所不同。当我尝试memset 时,我得到的输出为5
bool visited[21][21]; int ans[21][21];
memset(ans,10000,sizeof(ans));
memset(visited,0,sizeof(visited));
但是当我尝试用 for 循环替换 memset 时,我得到的输出为 -1
bool visited[21][21]; int ans[21][21];
for(int a1=0;a1<21;a1++)
{
for(int b1=0;b1<21;b1++)
{
ans[a1][b1]=10000;
}
}
for(int a1=0;a1<21;a1++)
{
for(int b1=0;b1<21;b1++)
{
visited[a1][b1]=0;
}
}
这里memset 给出了正确的输出,但for 循环不是。谁能解释一下这个原因或者用for 循环替换memset 的方法?
这是我的完整输入代码
#include<bits/stdc++.h>
using namespace std ;
bool ar[21][21]; bool visited[21][21]; int ans[21][21]; int xa[]={0,-1,0,1}; int yb[]={1,0,-1,0}; int n;
typedef struct Point{ int x,y;
}P;
typedef struct C { int x,y; int dis; } C;
bool issafe(int x,int y) { return (x>=0 && x<n && y>=0 && y<n && ar[x][y] && !visited[x][y]); }
void bfs(int x,int y) { queue<C> q; C in; in.x=x; in.y=y; in.dis=0; q.push(in); visited[x][y]=1;
while(!q.empty())
{
C c=q.front();
q.pop();
int a=c.x;
int b=c.y;
int d=c.dis;
ans[a][b]=d;
for(int i=0;i<4;i++)
{
int nx=a+xa[i];
int ny=b+yb[i];
if(issafe(nx,ny))
{
visited[nx][ny]=1;
in.x=nx;
in.y=ny;
in.dis=d+1;
q.push(in);
}
}
}
}
int main() {
cin>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>ar[i][j];
}
}
int q;
cin>>q;
P rare[q];
int fans=10000;
int mx=-1;
for(int i=0;i<q;i++)
{
int a,b;
cin>>a>>b;
rare[i].x=a;
rare[i].y=b;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
for(int k=0;k<21;k++){
for(int m=0;m<21;m++){
ans[k][m]=10000;
}
}
// memset(ans,10000,sizeof(ans));
int flag=0;
for(int l=0;l<21;l++)
{
for(int n1=0;n1<21;n1++){
visited[l][n1]=0;
}
}
// memset(visited,0,sizeof(visited));
mx=-1;
if(ar[i][j])
{
bfs(i,j);
for(int k=0;k<q;k++)
{
if(ans[rare[k].x][rare[k].y]==10000)
{
flag=1;
break;
}
}
if(!flag)
{
for(int k=0;k<q;k++)
{
mx=max(mx,ans[rare[k].x][rare[k].y]);
// cout<<mx<<endl;
}
}
// cout<< mx<<fans<<endl;
fans=min(fans,mx);
}
}
}
cout<<fans<<endl;
}
/* input
8
0 0 1 0 0 1 0 0
0 0 1 0 1 1 1 1
0 0 1 0 1 0 0 1
0 0 1 1 1 0 0 0
0 1 0 0 1 1 1 1
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
3
0 2
1 7
4 7
*/
【问题讨论】:
-
int ans[21][21]不会创建一个 21*21 的数组,而是创建 21 个 21 长的数组。 -
Memset not working的可能重复
-
我的 memset 提供了正确的输出,但对于 lopp 却没有。 @Mgetz
-
你提交的代码没有输出任何东西。
-
不要使用
memset,不要使用内置数组,避免使用循环。如果std::fill_n没有产生正确的结果,那么这意味着你做错了什么。这就是为什么你不应该使用memset或手动循环的原因,因为它们经常隐藏你做错事的事实。更改您的代码以使用std::array而不是内置数组,然后使用std::fill_n,然后从那里获取它。这将使以自然方式正确实现变得更加容易。