第16周 啊哈算法 炸弹人(两种算法注意对比)

问题及代码:

/*
炸弹人:计算出哪个位置的炸弹能炸到最多的人(本题有例外情况,需要优化) 
*/
#include
int main()
{
   char a[20][21];
   int i,j,sum,map=0,p,q,m,n,x,y;

   scanf("%d %d",&n,&m);//n表示行字符数
   for(i=0;i<=n-1;i++)
     scanf("%s",&a[i]); //读入n行字符 

   for(i=0;i<=n-1;i++)
     {
     for(j=0;j<=m-1;i++)
       {
         if(a[i][j]=='.') //判断可放置炸弹的位置
            {
               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++; //右移
                 }
               
              if(sum>map) //更新map的值 
                {
                  map=sum;
                  //p、q标记当前点坐标 
                  p=i;
                  q=j;
                 }
              }
           }
        }
      printf("放置的位置[%d,%d],消灭的敌人数量%d",p,q,sum);
      getchar();getchar();
      return 0;
 }


对sum>map不是很理解,map具体指什么?


/*炸弹人新解:深度优化算法更完美*/    
#include

struct note //给队列用,队列的元素为图的每一个坐标,包含x和y
 {
   int x;
   int y;
 };
char a[20][21];
int getnum(int i,int j)//当前i、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') //“G”表示敌人
       sum++;
      y--;
     }
   
   x=i;y=j;
   while(a[x][y]!='#')
    {
      if(a[x][y]=='G')
       sum++;
      y++;
     }
  
  return sum;
}

int main()
 {
   struct note q[401];
   int book[20][20]={0};
   int i,j,n,m,k,sum,startx,starty,tx,ty,mx,my,max=0;
   int head;
   int tail;
  
   //点向四个方向走
   int next[4][2]={{0,1},
                     {1,0},
                     {0,-1},
                     {-1,0}};
   
   scanf("%d %d %d %d",&n,&m,&startx,&starty); //读入行列数及初始坐标

   for(i=0;in||ty<0||ty>n) //判断边界
       continue;
       if(a[tx][ty]=='.' && book[tx][ty]==0) //“.”表示可以放置炸弹
        {
          book[mx][my]==1;
          q[tail].x=tx;//入栈
          q[tail].y=ty;
          tail++;
      
          sum=getnum(tx,ty);
          if(sum>max)
           {
             max=sum;
             mx=tx;
             my=ty;
            }
        }
    }
   head++;
  }
   printf("将炸弹放置在(%d,%d)处,可以消灭%d个敌人",mx,my,max);

   getchar();getchar();
   return 0;
 }

你可能感兴趣的:(C语言,算法与结构,C语言案例)