现在的位置: 首页 > 综合 > 正文

hdu 2544 对memset()缺乏认识

2018年04月26日 ⁄ 综合 ⁄ 共 2063字 ⁄ 字号 评论关闭

1,定义时,如果用0x3f3f3f3f 下面对map赋值时可以用memset(map,data,sizeof(map)),如果定义成了100000000,则下面赋值应该用循环赋值
#include<stdio.h>
#include<string.h>
#define data  0x3f3f3f3f
int map[105][105];
int n,m;
int floyd(int x,int y)
{
 for(int k=1;k<=n;k++)
  for(int i=1;i<=n;i++)
   for(int j=1;j<=n;j++)
    if (map[i][j] > map[i][k]+map[k][j])
                       map[i][j] =map[i][k]+map[k][j];
  return map[x][y];
}
int main()
{
 int a,b,c;
 while(scanf("%d%d",&n,&m)&&n!=0&&m!=0)
 {
  memset(map,data,sizeof(map));
  /*for(int i=1;i<=n;i++)
   for(int j=1;j<=n;j++)
    map[i][j]=100000000;*/
  for(int i=1;i<=m;i++)
  {
   scanf("%d%d%d",&a,&b,&c);
   if(map[a][b]>c)  map[a][b]=map[b][a]=c;
  }
  printf("%d\n",floyd(1,n));
 }
 return 0;
}


2

#include<stdio.h>
#include<string.h>
#define data 100000000
int map[105][105];
int n,m;
int floyd(int x,int y)
{
 for(int k=1;k<=n;k++)
  for(int i=1;i<=n;i++)
   for(int j=1;j<=n;j++)
    if (map[i][j] > map[i][k]+map[k][j])
                       map[i][j] =map[i][k]+map[k][j];
  return map[x][y];
}
int main()
{
 int a,b,c;
 while(scanf("%d%d",&n,&m)&&n!=0&&m!=0)
 {
  //memset(map,data,sizeof(map));
  for(int i=1;i<=n;i++)
   for(int j=1;j<=n;j++)
    map[i][j]=data;
  for(int i=1;i<=m;i++)
  {
   scanf("%d%d%d",&a,&b,&c);
   if(map[a][b]>c)  map[a][b]=map[b][a]=c;
  }
  printf("%d\n",floyd(1,n));
 }
 return 0;
}

如下demo是可以的,能把数组中的元素值都设置成字符1

#include <iostream>

#include <cstring>

using namespace std;

int main()

{

     char a[5];

     memset(a,'1',5);

     for(int i = 0;i < 5;i++)

       cout<<a[i]<<"   ";

     system("pause");

     return 0;

}
而,如下程序想吧数组中的元素值设置成1,却是不可行的
#include <iostream>

#include <cstring>

using namespace std;

int main()

{

     int a[5];

     memset(a,1,5);//这里改成memset(a,1,5 *sizeof(int))也是不可以的

     for(int i = 0;i < 5;i++)

       cout<<a[i]<<"   ";

     system("pause");

     return 0;

}
问题是:

1,第一个程序为什么可以,而第二个不行,

2,不想要用for,或是while循环来初始化int a[5];能做到吗?(有没有一个像memset()这样的函数初始化)

答:

1.因为第一个程序的数组a是字符型的,字符型占据内存大小是1Byte,而memset函数也是以字节为单位进行赋值的,所以你输出没有问题。而第二个程序a是整型的,使用memset还是按字节赋值,这样赋值完以后,每个数组元素的值实际上是0x01010101即十进制的16843009。你看看你输出结果是否这样?

2.如果用memset(a,1,20);

就是对a指向的内存的20个字节进行赋值,每个都用ASCII为1的字符去填充,转为二进制后,1就是00000001,占一个字节。一个INT元素是4字节,合一起就是1000000010000000100000001,就等于16843009,就完成了对一个INT元素的赋值了

抱歉!评论已关闭.