第四章、万能的搜索

第一节、深度优先搜索
p78 输出全排列的 dfs 方法

#include <stdio.h>
int a[10],book[10],n;

void dfs(int step)
{
  int i;
  if(step==n+1)
  {
    for(i=1;i<=n;i++)
      printf("%d",a[i]);
    printf("\n");
    return;
  }
  for(i=1;i<=n;i++)
  {
    if(book[i]==0)
    {
      a[step]=i;
      book[i]=1;
      dfs(step+1);
      book[i]=0;
    }
  }
  return;
}

int main()
{
  scanf("%d",&n);
  dfs(1);
  getchar();
  return 0;
}

为了深入了解深搜,用两个方法改变程序:
1、

#include <stdio.h>
int a[10],book[10],n;

void dfs(int step)
{
  int i;
  if(step==n+1)
  {
    for(i=1;i<=n;i++)
      printf("%d",a[i]);
    printf("\n");
    return;
  }
  for(i=1;i<=n;i++)
  {
    if(book[i]==0)
    {
      a[step]=i;
      book[i]=1;
      dfs(step+1);
      printf("i is %d\n",i); // 加这句,观察回溯过程
      book[i]=0;
    }
  }
  return;
}

int main()
{
  //scanf("%d",&n);
  n=3;
  dfs(1);
  getchar();
  return 0;
}

2、

#include <stdio.h>
int a[10],n;

void dfs(int step)
{
  int i;
  if(step==n+1)
  {
    for(i=1;i<=n;i++)
      printf("%d",a[i]);
    printf("\n");
    return;
  }
  for(i=1;i<=n;i++)
  {
    //把标志与回溯都去掉了。这样没有了剪枝,就可以走遍全部节点
    a[step]=i;
    dfs(step+1);
  }
  return;
}

int main()
{
  scanf("%d",&n);
  dfs(1);
  getchar();
  return 0;
}

p80 1~9九个数填空的DFS方法
( 9!=362880 )

#include <stdio.h>
int a[10],book[10],total=0;

void dfs(int step)
{
  int i;
  if(step==10)
  {
    if(a[1]*100+a[2]*10+a[3] + a[4]*100+a[5]*10+a[6] ==
      a[7]*100+a[8]*10+a[9])
    {
      total++;
      printf("%d%d%d+%d%d%d=%d%d%d\n", a[1], a[2], a[3], a[4],
        a[5], a[6], a[7], a[8], a[9]);
    }
    return;
  }
  for(i=1;i<=9;i++)
  {
    if(book[i]==0)
    {
      a[step]=i;
      book[i]=1;
      dfs(step+1);
      book[i]=0;
    }
  }
  return;
}

int main()
{
  dfs(1);
  printf("total=%d",total/2);
  getchar();
  return 0;
}

#include <stdio.h>
int a[10],book[10],total=0,sum=0;

void dfs(int step)
{
  int i;
  if(step==10)
  {
    sum++;
    if(a[1]*100+a[2]*10+a[3] + a[4]*100+a[5]*10+a[6] ==
      a[7]*100+a[8]*10+a[9])
    {
      total++;
      printf("%d%d%d+%d%d%d=%d%d%d\n", a[1], a[2], a[3], a[4],
        a[5], a[6], a[7], a[8], a[9]);
    }
    return;
  }
  for(i=1;i<=9;i++)
  {
    if(book[i]==0)
    {
      a[step]=i;
      book[i]=1;
      dfs(step+1);
      book[i]=0;
    }
  }
  return;
}

int main()
{
  dfs(1);
  printf("total=%d,sum=%d",total/2,sum);
  getchar();
  return 0;
}

第二节、解救小哈
p85 用DFS来寻找解救小哈的最短路径数

#include <stdio.h>
int n,m,p,q,min=99999999;
int a[51][51],book[51][51];

void dfs(int x,int y,int step)
{
  int next[4][2] = { {0,1},
                     {1,0},
                     {0,-1},
                     {-1,0} };
  int tx,ty,k;
  if(x==p && y==q)
  {
    if(step<min) min=step;
    return;
  }

  for(k=0;k<=3;k++)
  {
    tx=x+next[k][0]; //next第一列
    ty=y+next[k][1]; //第二列
    if(tx<1 || tx>n || ty<1 || ty>m) //新坐标越界
      continue;
    if(a[tx][ty]==0 && book[tx][ty]==0) //新坐标未走过,且无路障
    {
      book[tx][ty]=1;
      dfs(tx,ty,step+1);
      book[tx][ty]=0;
    }
  }
  return;
}

int main()
{
  int i,j,startx,starty;
  scanf("%d %d",&n,&m); //行、列
  for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
      scanf("%d", &a[i][j]);
  scanf("%d %d %d %d",&startx,&starty,&p,&q); //起点与终点坐标

  book[startx][starty]=1;
  dfs(startx,starty,0);
  printf("%d",min);
  getchar();
  return 0;
}

/*

5 4
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
1 1 4 3

*/

第三节、广度优先搜索
p92 BFS解救小哈

#include <stdio.h>
struct note
{
  int x;
  int y;
  int f;
  int s;
};

int main()
{
  struct note que[2501];
  int a[51][51]={0},book[51][51]={0};
  int next[4][2] = { {0,1},
                     {1,0},
                     {0,-1},
                     {-1,0} };
  int head, tail;
  int i, j, k, n, m, startx, starty, p, q, tx, ty, flag;
  scanf("%d %d", &n, &m); //行、列
  for(i = 1; i <= n; i++)
    for(j = 1; j <= m; j++)
      scanf("%d", &a[i][j]);
  scanf("%d %d %d %d", &startx, &starty, &p, &q); //起点与终点坐标
  head = 1;
  tail = 1;
  que[tail].x = startx;
  que[tail].y = starty;
  que[tail].f = 0;
  que[tail].s = 0;
  tail++;
  book[startx][starty] = 1;

  flag = 0;
  while(head < tail)
  {
    for(k = 0; k <= 3; k++)
    {
      tx = que[head].x + next[k][0];
      ty = que[head].y + next[k][1];
      if(tx < 1 || tx > n || ty < 1 || ty > m) //新坐标越界
        continue;
      if(a[tx][ty] == 0 && book[tx][ty] == 0)  //新坐标未走过,且无路障
      {
        book[tx][ty] = 1;
        que[tail].x = tx;
        que[tail].y = ty;
        que[tail].f = head;
        que[tail].s = que[head].s + 1;
        tail++;
      }
      if(tx == p && ty == q)
      {
        flag = 1;
        break;
      }
    }
    if(flag == 1)
      break;
    head++;
  }

  printf("%d\n", que[tail - 1].s);
  getchar(); getchar();
  return 0;
}

/*

5 4
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
1 1 4 3

*/

第四节、再解炸弹人
p98 广搜解炸弹人

#include <stdio.h>
struct note
{
  int x;
  int y;
};
char a[20][21];

int getnum(int i, int j)
{
  int sum, x, y;
  sum = 0;

  //向上统计可以消灭的敌人数
  x = i; y = j;
  while(a[x][y] != ‘#‘)
  {
    if(a[x][y] == ‘G‘)
      sum++;
    x--;
  }

  //向下统计可以消灭的敌人数
  x = i; y = j;
  while(a[x][y] != ‘#‘)
  {
    if(a[x][y] == ‘G‘)
      sum++;
    x++;
  }

  //向左统计可以消灭的敌人数
  x = i; y = j;
  while(a[x][y] != ‘#‘)
  {
    if(a[x][y] == ‘G‘)
      sum++;
    y--;
  }

  //向右统计可以消灭的敌人数
  x = i; y = j;
  while(a[x][y] != ‘#‘)
  {
    if(a[x][y] == ‘G‘)
      sum++;
    y++;
  }

  return sum;
}

int main()
{
  struct note que[401];
  int head,tail;
  int book[20][20]={0};
  int i,k,sum,max=0,mx,my,n,m,startx,starty,tx,ty;

  int next[4][2] = { {0,1},
                     {1,0},
                     {0,-1},
                     {-1,0} };

  scanf("%d %d %d %d", &n, &m, &startx, &starty); //n行,m列  起始坐标

  for(i = 0; i <= n - 1; i++)
    scanf("%s", a[i]);  

  head=1;
  tail=1;
  que[tail].x=startx;
  que[tail].y=starty;
  tail++;
  book[startx][starty]=1;
  max=getnum(startx,starty);
  mx=startx;
  my=starty;

  while(head<tail)
  {
    for(k = 0; k <= 3; k++)
    {
      tx = que[head].x + next[k][0];
      ty = que[head].y + next[k][1];

      if(tx < 0 || tx > n-1 || ty < 0 || ty > m-1) //新坐标越界
        continue;

      if(a[tx][ty] == ‘.‘ && book[tx][ty] == 0)  //新坐标未走过,且无路障
      {
        book[tx][ty] = 1;
        que[tail].x = tx;
        que[tail].y = ty;
        tail++;
        sum=getnum(tx,ty);

        //printf("haha %d %d %d\n",tx,ty,sum); //可以观察中间输出过程

        if(sum>max)
        {
          max=sum;
          mx=tx;
          my=ty;
        }
      }
    }
    head++;
  }

  //printf("将炸弹放置在(%d,%d),最多可以消灭%d个敌人\n", mx,my,max);
  printf("bomp here:(%d,%d),most is:%d\n",mx,my,max);
  getchar();
  getchar();
  return 0;
}

/*
p66 (6,11)改为平地

13 13 3 3
#############
#GG.GGG#GGG.#
###.#G#G#G#G#
#.......#..G#
#G#.###.#G#G#
#GG.GGG.#.GG#
#G#.#G#.#.#.#
##G...G.....#
#G#.#G###.#G#
#...G#GGG.GG#
#G#.#G#G#.#G#
#GG.GGG#G.GG#
#############

*/

p103 深搜解炸弹人

#include <stdio.h>
char a[20][21];
int book[20][20],max,mx,my,n,m;

int getnum(int i, int j)
{
  int sum, x, y;
  sum = 0;

  //向上统计可以消灭的敌人数
  x = i; y = j;
  while(a[x][y] != ‘#‘)
  {
    if(a[x][y] == ‘G‘)
      sum++;
    x--;
  }

  //向下统计可以消灭的敌人数
  x = i; y = j;
  while(a[x][y] != ‘#‘)
  {
    if(a[x][y] == ‘G‘)
      sum++;
    x++;
  }

  //向左统计可以消灭的敌人数
  x = i; y = j;
  while(a[x][y] != ‘#‘)
  {
    if(a[x][y] == ‘G‘)
      sum++;
    y--;
  }

  //向右统计可以消灭的敌人数
  x = i; y = j;
  while(a[x][y] != ‘#‘)
  {
    if(a[x][y] == ‘G‘)
      sum++;
    y++;
  }

  return sum;
}

void dfs(int x,int y)
{
  int next[4][2] = { {0,1},
                     {1,0},
                     {0,-1},
                     {-1,0} };
  int k,sum,tx,ty;
  sum=getnum(x,y);

  if(sum>max)
  {
    max=sum;
    mx=x;
    my=y;
  }

  for(k = 0; k <= 3; k++)
  {
    tx = x + next[k][0];
    ty = y + next[k][1];

    if(tx < 0 || tx > n-1 || ty < 0 || ty > m-1) //新坐标越界
      continue;

    if(a[tx][ty] == ‘.‘ && book[tx][ty] == 0)  //新坐标未走过,且无路障
    {
        book[tx][ty] = 1;
        dfs(tx,ty);
    }
  }
  return;
}  

int main()
{
  int i,startx,starty;
  scanf("%d %d %d %d", &n, &m, &startx, &starty); //n行,m列  起始坐标

  for(i = 0; i <= n - 1; i++)
    scanf("%s", a[i]);  

  book[startx][starty]=1;
  max=getnum(startx,starty);
  mx=startx;
  my=starty;
  dfs(startx,starty);

  //printf("将炸弹放置在(%d,%d),最多可以消灭%d个敌人\n", mx,my,max);
  printf("bomp here:(%d,%d),most is:%d\n",mx,my,max);
  getchar();
  getchar();
  return 0;
}

/*
p66 (6,11)改为平地

13 13 3 3
#############
#GG.GGG#GGG.#
###.#G#G#G#G#
#.......#..G#
#G#.###.#G#G#
#GG.GGG.#.GG#
#G#.#G#.#.#.#
##G...G.....#
#G#.#G###.#G#
#...G#GGG.GG#
#G#.#G#G#.#G#
#GG.GGG#G.GG#
#############

*/

第五节、宝岛探险
p107 广搜计算小岛面积

#include <stdio.h>
struct note
{
  int x;
  int y;
};

int main()
{
  struct note que[2501];
  int head,tail;
  int a[51][51];
  int book[20][20]={0};
  int i,j,k,sum,n,m,startx,starty,tx,ty;

  int next[4][2] = { {0,1},
                     {1,0},
                     {0,-1},
                     {-1,0} };

  scanf("%d %d %d %d", &n, &m, &startx, &starty); //n行,m列  起始坐标

  for(i = 1; i <= n; i++)
    for(j = 1; j <= m; j++)
      scanf("%d", &a[i][j]); 

  head=1;
  tail=1;
  que[tail].x=startx;
  que[tail].y=starty;
  tail++;
  book[startx][starty]=1;
  sum=1;

  while(head<tail)
  {
    for(k = 0; k <= 3; k++)
    {
      tx = que[head].x + next[k][0];
      ty = que[head].y + next[k][1];

      if(tx < 1 || tx > n || ty < 1 || ty > m) //新坐标越界
        continue;

      if(a[tx][ty] > 0 && book[tx][ty] == 0)  //是陆地,且新坐标未走过
      {
        sum++;
        book[tx][ty] = 1;
        que[tail].x = tx;
        que[tail].y = ty;
        tail++;
      }
    }
    head++;
  }

  printf("%d\n",sum);
  getchar();
  getchar();
  return 0;
}

/*

10 10 6 8
1 2 1 0 0 0 0 0 2 3
3 0 2 0 1 2 1 0 1 2
4 0 1 0 1 2 3 2 0 1
3 2 0 0 0 1 2 4 0 0
0 0 0 0 0 0 1 5 3 0
0 1 2 1 0 1 5 4 3 0
0 1 2 3 1 3 6 2 1 0
0 0 3 4 8 9 7 5 0 0
0 0 0 3 7 8 6 0 1 2
0 0 0 0 0 0 0 0 1 0

*/

p110 深搜计算小岛面积

#include <stdio.h>
int a[51][51];
int book[51][51],n,m,sum;

void dfs(int x,int y)
{
  int next[4][2] = { {0,1},
                     {1,0},
                     {0,-1},
                     {-1,0} };
  int k,tx,ty;
  for(k = 0; k <= 3; k++)
  {
    tx = x + next[k][0];
    ty = y + next[k][1];

    if(tx < 1 || tx > n || ty < 1 || ty > m) //新坐标越界
        continue;

    if(a[tx][ty] > 0 && book[tx][ty] == 0)  //是陆地,且新坐标未走过
    {
      sum++;
      book[tx][ty] = 1;
      dfs(tx,ty);
    }
  }
  return;
}  

int main()
{
  int i,j,startx,starty;
  scanf("%d %d %d %d", &n, &m, &startx, &starty); //n行,m列  起始坐标

  for(i = 1; i <= n; i++)
    for(j = 1; j <= m; j++)
      scanf("%d", &a[i][j]); 

  book[startx][starty]=1;
  sum=1;
  dfs(startx,starty); //
  printf("%d\n",sum);
  getchar(); getchar();
  return 0;
}

/*

10 10 6 8
1 2 1 0 0 0 0 0 2 3
3 0 2 0 1 2 1 0 1 2
4 0 1 0 1 2 3 2 0 1
3 2 0 0 0 1 2 4 0 0
0 0 0 0 0 0 1 5 3 0
0 1 2 1 0 1 5 4 3 0
0 1 2 3 1 3 6 2 1 0
0 0 3 4 8 9 7 5 0 0
0 0 0 3 7 8 6 0 1 2
0 0 0 0 0 0 0 0 1 0

*/

p112 小岛区域成-1

#include <stdio.h>
int a[51][51];
int book[51][51],n,m,sum;
  int next[4][2] = { {0,1},
                     {1,0},
                     {0,-1},
                     {-1,0} }; //放在这里可能更清楚

void dfs(int x,int y,int color)
{
  int k,tx,ty;
  a[x][y]=color; //当前点着色。下面是扩展点。。
  for(k = 0; k <= 3; k++)
  {
    tx = x + next[k][0];
    ty = y + next[k][1];

    if(tx < 1 || tx > n || ty < 1 || ty > m) //新坐标越界
        continue;

    if(a[tx][ty] > 0 && book[tx][ty] == 0)  //是陆地,且新坐标未走过
    {
      sum++;
      book[tx][ty] = 1;
      dfs(tx,ty,color); //一旦调用dfs,就着色
    }
  }
  return;
}  

int main()
{
  int i,j,startx,starty;
  scanf("%d %d %d %d", &n, &m, &startx, &starty); //n行,m列  起始坐标

  for(i = 1; i <= n; i++)
    for(j = 1; j <= m; j++)
      scanf("%d", &a[i][j]); 

  book[startx][starty]=1;
  sum=1;

  dfs(startx,starty,-1); //

  for(i = 1; i <= n; i++)
  {
    for(j = 1; j <= m; j++)
      printf("%3d", a[i][j]);
    printf("\n");
  }

  printf("%d\n",sum);
  getchar(); getchar();
  return 0;
}

/*

10 10 6 8
1 2 1 0 0 0 0 0 2 3
3 0 2 0 1 2 1 0 1 2
4 0 1 0 1 2 3 2 0 1
3 2 0 0 0 1 2 4 0 0
0 0 0 0 0 0 1 5 3 0
0 1 2 1 0 1 5 4 3 0
0 1 2 3 1 3 6 2 1 0
0 0 3 4 8 9 7 5 0 0
0 0 0 3 7 8 6 0 1 2
0 0 0 0 0 0 0 0 1 0

*/

p114 计算小岛个数之漫水填充法

#include <stdio.h>
int a[51][51];
int book[51][51],n,m; //sum用不着了
  int next[4][2] = { {0,1},
                     {1,0},
                     {0,-1},
                     {-1,0} }; //放在这里可能更清楚

void dfs(int x,int y,int color)
{
  int k,tx,ty;
  a[x][y]=color; //当前点着色。下面是扩展点。。
  for(k = 0; k <= 3; k++)
  {
    tx = x + next[k][0];
    ty = y + next[k][1];

    if(tx < 1 || tx > n || ty < 1 || ty > m) //新坐标越界
        continue;

    if(a[tx][ty] > 0 && book[tx][ty] == 0)  //是陆地,且新坐标未走过
    {
      //sum++;
      book[tx][ty] = 1;
      dfs(tx,ty,color); //一旦调用dfs,就着色
    }
  }
  return;
}  

int main()
{
  int i,j,num=0;
  scanf("%d %d", &n, &m); //n行,m列  起始坐标不必有了

  for(i = 1; i <= n; i++)
    for(j = 1; j <= m; j++)
      scanf("%d", &a[i][j]); 

  //枚举着色
  for(i = 1; i <= n; i++)
  {
    for(j = 1; j <= m; j++)
    {
      if(a[i][j]>0)
      {
        num--;
        book[i][j]=1;
        dfs(i,j,num); //
      }
    }
  }

  for(i = 1; i <= n; i++)
  {
    for(j = 1; j <= m; j++)
      printf("%3d", a[i][j]);
    printf("\n");
  }

  printf("Number is:%d\n",-num); //小岛个数
  getchar(); getchar();
  return 0;
}

/*

10 10
1 2 1 0 0 0 0 0 2 3
3 0 2 0 1 2 1 0 1 2
4 0 1 0 1 2 3 2 0 1
3 2 0 0 0 1 2 4 0 0
0 0 0 0 0 0 1 5 3 0
0 1 2 1 0 1 5 4 3 0
0 1 2 3 1 3 6 2 1 0
0 0 3 4 8 9 7 5 0 0
0 0 0 3 7 8 6 0 1 2
0 0 0 0 0 0 0 0 1 0

*/

第六节、水管工游戏
p121 DFS解水管工游戏

#include <stdio.h>
int a[51][51];
int book[51][51],n,m,flag=0;

void dfs(int x,int y,int front)
{
  if(x==n && y==m+1) //已经出口
  {
    flag=1;
    return;
  }

  if(x < 1 || x > n || y < 1 || y > m) //坐标越界
    return;
  if( book[x][y] == 1)
    return;
  book[x][y]=1;

  if(a[x][y]>=5 && a[x][y]<=6) //直管
  {
    if(front==1) dfs(x,y+1,1);
    if(front==2) dfs(x+1,y,2);
    if(front==3) dfs(x,y-1,3);
    if(front==4) dfs(x-1,y,4);
  }

  if(a[x][y]>=1 && a[x][y]<=4) //弯管
  {
    if(front==1)
    {
      dfs(x+1,y,2);
      dfs(x-1,y,4);
    }
    if(front==2)
    {
      dfs(x,y+1,1);
      dfs(x,y-1,3);
    }
    if(front==3)
    {
      dfs(x-1,y,4);
      dfs(x+1,y,2);
    }
    if(front==4)
    {
      dfs(x,y+1,1);
      dfs(x,y-1,3);
    }
  }

  book[x][y]=0; //取消标记,即回溯
  return;
}

int main()
{
  int i,j;
  scanf("%d %d", &n, &m); //n行,m列

  for(i = 1; i <= n; i++)
    for(j = 1; j <= m; j++)
      scanf("%d", &a[i][j]); 

  dfs(1,1,1);
  if(flag==0)
    printf("impossible\n");
  else
    printf("possible\n");
  getchar(); getchar();
  return 0;
}

/*

5 4
5 3 5 3
1 5 3 0
2 3 5 1
6 1 1 5
1 5 5 4

*/

p124 DFS解水管工游戏,输出路径

#include <stdio.h>
int a[51][51];
int book[51][51],n,m,flag=0;
struct note
{
  int x;
  int y;
} s[100];
int top=0;

void dfs(int x,int y,int front)
{
  int i;
  if(x==n && y==m+1) //已经出口
  {
    flag=1;
    for(i=1;i<=top;i++)
      printf("(%d,%d) ",s[i].x,s[i].y);
    return;
  }

  if(x < 1 || x > n || y < 1 || y > m) //坐标越界
    return;
  if( book[x][y] == 1)
    return;
  book[x][y]=1;

  //将当前尝试的坐标入栈
  top++;
  s[top].x=x;
  s[top].y=y;

  if(a[x][y]>=5 && a[x][y]<=6) //直管
  {
    if(front==1) dfs(x,y+1,1);
    if(front==2) dfs(x+1,y,2);
    if(front==3) dfs(x,y-1,3);
    if(front==4) dfs(x-1,y,4);
  }

  if(a[x][y]>=1 && a[x][y]<=4) //弯管
  {
    if(front==1)
    {
      dfs(x+1,y,2);
      dfs(x-1,y,4);
    }
    if(front==2)
    {
      dfs(x,y+1,1);
      dfs(x,y-1,3);
    }
    if(front==3)
    {
      dfs(x-1,y,4);
      dfs(x+1,y,2);
    }
    if(front==4)
    {
      dfs(x,y+1,1);
      dfs(x,y-1,3);
    }
  }

  book[x][y]=0; //取消标记,即回溯
  top--; // 将当前尝试的坐标出栈
  return;
}

int main()
{
  int i,j;
  scanf("%d %d", &n, &m); //n行,m列

  for(i = 1; i <= n; i++)
    for(j = 1; j <= m; j++)
      scanf("%d", &a[i][j]); 

  dfs(1,1,1);
  if(flag==0)
    printf("impossible\n");

  getchar(); getchar();
  return 0;

/*

5 4
5 3 5 3
1 5 3 0
2 3 5 1
6 1 1 5
1 5 5 4

*/
}



oj
以后整理。。。

top

时间: 2024-10-17 21:42:31

第四章、万能的搜索的相关文章

大道至简第四章读后感

在很多的时候,我们所听到的沟通,都是一种形式.例如与客户吃饭或者打回访电话.其实沟通是具有目的性的,如果在没有明确目的的情况下与客户沟通,那将是浪费客户和自己的时间.这种目的,可以是了解项目的讯息/挖掘潜在的项目......最后才是交流感情.然而在大多数情况下,他不仅仅被看着交流感情.这便成了形式.且往往顾客所讨厌的一种形式.<大道至简>第四章正交到了沟通的重要性. 我们在与人沟通时,我们应该尽力做到有效的沟通,应该清楚的是,保障每一次沟通的有效性都是最重要 的事.沟通不是打电话或者请客户吃饭

第四章 初步进入linux世界

第四章 初步进入linux世界 [Linux 系统启动过程] Linux的启动其实和windows的启动过程很类似,不过windows我们是无法看到启动信息的,而linux启动时我们会看到许多启动信息,例如某个服务是否启动. Linux系统的启动过程大体上可分为五部分:内核的引导:运行init:系统初始化:建立终端 :用户登录系统. A 内核引导 当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动.紧接着由启动设备上的grub程序开始引导linux,当引

[现代操作系统笔记][第四章文件系统]

第四章 文件系统 4.1 文件 从用户角度来考察文件.用户如何使用文件,文件有那些特性. 4.1.1 文件命名 文件一种抽象机制,提供了一种在磁盘上保留信息而且以后方便读取的方法. 有的文件系统区分大小写,有的则不区分 Unix是前者,MS-DOS是后者 FAT-16,FAT-32,NTFS. FAT-16(File Allocation Table,文件配置表) : Windows 95 FAT-32 : Windows 98 NTFS(New Technology File System,新

APUE学习笔记:第四章 文件和目录

4.1 引言 本章将描述文件的特征和文件的性质 4.2 stat.fstat和lstat函数 #include<sys/stat.h> int stat(const char *restrict pathname,struct stat *restrict buf); int fstat(int filedes,struct stat *buf) int lstat(const char *restrict pathname,struct stat *restrict buf); 三个函数的返

《大道至简》第四章有感

第四章主要讲述的是沟通,作为程序员我们能很好的与客户沟通吗,答案是否定的.开发人员总是先要接触客户,了解客户到底想要什么,来确定到底要做什么.但是客户不懂C,开发人员就不能有效的与客户沟通,就需要咨询公司借助UML来介入需求阶段,帮助了解和分析需求.因为客户不会C当然也不会UML,此时最直接的问题还是与客户如何交流?最为开发人员最重要的就是与客户交流,来了解客户的需求从而进行研发.无论是开发人员还是咨询公司,想达到的目的都是了解客户的需求,但是在这期间C和UML,客户都是不了解的.这就引出了一个

第四章 数组,字符串和指针

数组 数组若没有指定初始值则为内存遗留值 如果指定了部分初始值,那么其余部分也默认被指定为0: long data[100]={0};          //给data数组的所有元素赋0 字符串是附加有特殊字符(/0)的字符序列 数组的填充: char president[]="thank you"; wchar_t president[]=L"thank you";     //Unicode字符串 const int max=80; char name[max]

《Linux Shell脚本攻略》 笔记 第四章:高效文本处理

<Linux Shell脚本攻略> 笔记 第四章:高效文本处理 1.IP地址的正则表达式: [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} 2.grep用法 //在多级目录中对文本进行递归检索 [[email protected] program_test]# grep "yang" ./ -Rn ./test.txt:6:laoyang ./right.txt:1:1 yang man //忽略大小写匹配 [[email pr

APUE读书笔记-第四章 文件和目录

到第四章了,不知什么时候才能把这本书看完,耽误的时间太多了. 第四章是在第三章的基础上,主要描述文件系统的其他性质和文件的性质. 4.2 stat.fstat.fstatat.lstat函数 首先来看看这四个函数的原型: #include <sys/stat.h> ///usr/include/x86_64-linux-gnu/sys/ int stat (const char *__restrict __file, struct stat *__restrict __buf) int fst

第四章谈谈中文分词

1.中文分词的演变 由于中文等语言,字与字之间是没有空格隔开的,所以需要分词.最简单的分词就是查字典.就是从左到右或者从右到左扫描一句话,然后找到最长的匹配.这种方法可以解决七八成的分词问题.但是毕竟太简单了一点.后来哈工大王晓龙博士把查字典方法理论化,发展成最少词数的分词理论,即一句话应该分成数量最少的词串.但是他无法解决“北京大学生”这样的二义性分割问题.直到20世纪90年代,郭进博士用统计语言模型成功解决了分词二义性问题.假设我们有几种不同的分词方法,那么最好的方法应该是出现概率最大的划分

android驱动开发第三、四章读书笔记

第三章讲解了git及git操作的基本命令 1.git是一款免费.开源的分布式版本控制系统,符合linux的开源思想,且相对于svn cvs等,git有自己的优势,且广受开发者欢迎 2.git的安装: apt-get install git apt-get install git-doc git-svn apt-get install git-email git-gui gitk 3.常见命令: man git—checkout   /  git help git-checkout    查看gi