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取模
矩阵相乘