12.23蓝桥杯笔记(2)续上BFS+快速幂

2019年真题 迷宫

#include <stdio.h>
#define N 50
int map[N][N];//二维数组表示迷宫 0是可以通过,1是墙壁
typedef struct node{
    int x;
    int y;
    int c;
}linkstack; //结构体存储数组信息
linkstack top[N*N];//创建一个N*N的栈
void array(int g) {//输入数组元素
    int a,b;
    for(a=0; a<g; a++)
    { for(b=0; b<g; b++)
        { scanf("%d",&map[a][b]);
        }  }   }
void initmap(int g) {//生成迷宫
       int a,b;
       printf("生成的迷宫是:\n");
       for(a=0;a<g;a++)
      {for(b=0;b<g;b++)
         { printf(map[a][b]?"#":" ");
         }
          printf("\n");
      }   }
int i,j,k,run,v,m;
int main(){
  int g;
  scanf("%d",&g);
  array(g);
  for(i=0;i<g*g;i++)
  {top[i].c=1;//x轴,y轴,c表示方向???
  }
  initmap(g);
  i=0;
  top[i].x=1;//i=0时,x方向对应的和值为1
  top[i].y=0;//i=0时,y方向对应的和值为0
  map[1][0]=2;//入口迷宫值变为2
  run=1;
  v=1;
  do{
     if(top[i].c<5)//若i点可到方向值小于5则向下进行
     { if(top[i].x==(g-2)&&top[i].y==(g-1))//当i点为出口时所满足的条件
         {printf("第%d条通路为",m++);
              for(j=0;j<=i;j++)
              {printf("(%d,%d)",top[j].x,top[j].y);
              }//输出通路坐标
                 printf("\n");
              for(j=0;j<g;j++)//求出迷宫路线图形
              { for(k=0;k<g;k++)
                     {if(map[j][k]==0)
                            printf(" ");
                       else if(map[j][k]==2)
                              printf("O");
                       else printf("#");
                      }
                    printf("\n");
              }
            map[top[i].x][top[i].y]=0;
                top[i].c=1;
                i--;
                top[i].c+=1;
                continue;
         }
         switch(top[i].c){
case 0:
                 {run=0;
                    if(v==1)
                     printf("此迷宫无通路!");
                  break;
                 }
            case 1:
                 {if(map[top[i].x][top[i].y+1]==0)
                      { i++;
                       top[i].x=top[i-1].x;
                       top[i].y=top[i-1].y+1;
                      map[top[i].x][top[i].y]=2;
                       if(map[g-2][g-1]==2)
                          v=0;
                       }
                   else  top[i].c+=1;
                 break;
                 }
            case 2:
                {if(map[top[i].x-1][top[i].y]==0)
                     { i++;
                       top[i].x=top[i-1].x-1;
                       top[i].y=top[i-1].y;
                       map[top[i].x][top[i].y]=2;
                     }
                    else  top[i].c+=1;
                    break;
                }
                case 3:
                {if(map[top[i].x][top[i].y-1]==0)
                    { i++;
                       top[i].x=top[i-1].x;
                       top[i].y=top[i-1].y-1;
                       map[top[i].x][top[i].y]=2;
                    }
                  else  top[i].c+=1;
                  break;
                }
                case 4:
                {
                  if(map[top[i].x+1][top[i].y]==0)
                    {   i++;
                       top[i].x=top[i-1].x+1;
                       top[i].y=top[i-1].y;
                      map[top[i].x][top[i].y]=2;
                    }
                  else   top[i].c+=1;
                  break;
                }   }   }
         else { if(i==0) return 0;
             map[top[i].x][top[i].y]=0;
             top[i].c=1;
             i--;
             top[i].c+=1; }
      }while(run==1);
     }

快速幂和矩阵快速幂(模运算,快速幂,矩阵乘法,矩阵快速幂)

模运算C语言 负数的模运算,无论正负都按正整数计算,然后加上符号,跟被除数相同

有时一个数太大无法直接输出就要把他取模之后,缩小数值再输出

判断奇偶可以用位运算时间要比取模短的多

快速幂 当指数很大时,要算很多次,太慢了

一个简单思路也可以用。

快速幂中间需要做的就是将指数换算成二进制,然后不断向右移,然后判断最后一位是不是0,需不需要算。快速幂的数值会很快就变大,注意中间要进行取模操作。

1e9=1000000000 10的九次方 取后四位就是对10000取模

矩阵相乘

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值