Examen escrito de reclutamiento de Alibaba 2020.3.23 (Fast Power / BFS)

Afirmación : Probablemente el título es del área de discusión de Niu Ke. La entrada, la salida y el rango de datos del título también son un poco desconocidos. Solo mire las ideas. Estos detalles no importan QAQ. Corríjame si hay un error ~
Prueba escrita de Ali 3.23

Tema uno (potencia rápida)

Elija cualquier número de personas de n personas para formar un equipo, y luego seleccione un capitán de un equipo. Los diferentes capitanes cuentan diferentes combinaciones. Pida el número de tales combinaciones para tomar 10 ^ 9 + 7.
Rango de datos: 1 <= n <= 1000000000;
Idea: la respuesta es norte 2 norte - 1 n * 2 ^ {n-1} , elija uno para ser el líder, y los otros tienen 2 opciones.

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int mod = 1e9+7;

int quickp(ll a,ll p) {
	ll res = 1;
	while(p) {
		if(p&1) res = res*a%mod;
		a = a*a%mod;
		p >>= 1;
	}
	return res;
}
int main() {
	ll n;
	scanf("%lld",&n);
	printf("%lld\n",n*quickp(2LL,n-1)%mod);
} 

Tema 2 (BFS)

Un mapa n * m contiene 1 punto inicial y 1 punto final Otros puntos incluyen puntos alcanzables e inalcanzables. Cada vez que puede: moverse hacia arriba, hacia abajo, hacia la izquierda o hacia la derecha, o usar 1 energía para moverse de (i, j) a (n-1-i, m-1-j) instantáneamente, puede usar hasta 5 energías.
Rango de datos: 2 <= n, m <= 500;

输入:
4 4
#S..
E#..
....
....
输出:
4
解释:S(0,1)先瞬移到(3, 2),然后往上一步,往右一步,瞬移到E,一共4

Idea: BFS

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 510;

int n,m;
char s[maxn][maxn];
bool vis[maxn][maxn];
struct node{
	int x,y,step;
	int count;
}cur,tmp;
bool check(int x,int y) {
	if(x<0 || x>=n || y<0 || y>= m) return 0;
	if(s[x][y] == '#') return 0;
	return 1;
}
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
int bfs(int sx,int sy) {
	cur.x = sx;cur.y = sy;
	cur.step = 0;cur.count = 5;
	queue<node> q;
	int x,y;
	vis[sx][sy] = 1;
	q.push(cur);
	while(!q.empty()) {
		cur = q.front();
		q.pop();
		if(s[cur.x][cur.y] == 'E') return cur.step;
		for(int i = 0;i < 4;++i) {
			x = cur.x+dx[i];
			y = cur.y+dy[i];
			if(!check(x,y) || vis[x][y]) continue;
			tmp = cur;
			tmp.x = x;tmp.y = y;
			tmp.step++;
			q.push(tmp);
		}
		x = n-1-cur.x;
		y = m-1-cur.y;
		if(!check(x,y) || vis[x][y]) continue;
		cur.x = x;cur.y = y;
		cur.step++;cur.count--;
		q.push(cur);
	}
	return -1;
}
int main() {
	scanf("%d%d",&n,&m);
	int x,y;
	for(int i = 0;i < n;++i) {
		scanf("%s",s[i]);
		for(int j = 0;j < m;++j) {
			if(s[i][j] == 'S') {
				x = i;y =j;
				break;
			}
		}
	}
	printf("%d\n",bfs(x,y));
}
/*
4 4
#S..
E#..
....
....

4

*/
Publicados 152 artículos originales · ganado elogios 2 · Vistas 6444

Supongo que te gusta

Origin blog.csdn.net/weixin_43918473/article/details/105271551
Recomendado
Clasificación