[Pensée de programmation et la pratique du CSP-M1 C] terribles rayons cosmiques

Description du sujet:

Les rayons cosmiques se propagent (peut être considérée comme deux dimensions diagramme en treillis) , dans un plan à deux dimensions infinies, la première direction vers le haut par défaut. Les rayons cosmiques sont émis après une séparation à distance dans cette direction d'environ 45 . Diviser les deux rayons cosmiques, alors que la puissance du même! Les rayons cosmiques se répartiront n fois, à chaque fois après une scission avant i unités de longueur.

Une description:

Entrée de la première ligne contient un nombre entier positif n (n <= 30) représentés par les rayons cosmiques répartis n fois
la seconde ligne contient n nombres entiers, a . 1 , 'A 2 , ..., A n , un certain nombre de I I (A i <= 5) indique combien d'unités de longueur i-ème division des rayons cosmiques serait aller dans la direction d' origine.

entrée de l'échantillon:

4
4 2 2 3

Description Sortie:

La sortie d'un nombre ans, représente le nombre d'unités de rayons cosmiques parcourus.

Exemple de sortie:

39

Point de données Description:

Les points de données n
dix% <= 10
40% <= 20
100% <= 30

idées:

La difficulté est à un point tout en répétant la détermination ne peut pas avoir une grande complexité temporelle. Bool peut créer un réseau plus large, montrant deux plat, valeur booléenne est représenté par le point de savoir si a été adoptée. Parce que A I <= 5, n -. <= 30, de sorte que le tableau a la taille de 300 * 300 assez, cela peut prendre un peu plus grand, en utilisant BFS de pensée vont chacun émettent des rayons cosmiques, chaque couche considérée BFS extension, à savoir, en utilisant un noeud après chaque file d' attente contient la direction d'extension de l'émission suivante. Mais cette approche, nous avons le temps BFS évidemment Déchaînement de violence, donc mis en place un réseau de cinq dimensions, chaque dimension de sens sont coordonnées x, y coordonnées, direction, longueur, étendue à plusieurs reprises. Ainsi, le marqueur peut être utilisé pour diffuser un point, ce point n'a pas de dossier à être pressé dans la file d' attente, si la file d' attente est entré à nouveau pressé ira à nouveau le même chemin, de sorte que les extensions peuvent être mis au rebut une fois répétée point, de sorte que nous pouvons réduire considérablement la complexité temporelle du programme.

réflexion:

1, pas pensé auparavant d'utiliser un tableau de cinq, mais l'utilisation d' un tableau à quatre dimensions, combien de fois ne pas étendre cette dimension, mais quand le test7 test est apparu WA, réalisé que, s'il n'y a pas de cinquième dimension, l' extension précédente l'enregistrement sera répété plus tard dans la suppression du point d'impact, qui est, après quelques - uns pourraient vouloir étendre le point et a été prolongée à plusieurs reprises avant de répéter le point, mais ils sont tout de même cette étape et la prochaine extension peut être différente, et par conséquent , si ceux - ci comme point de suppression des points en double sera sans aucun doute une partie de l'affaire est perdue, d' où l'utilisation d'un des tableaux de cinq dimensions ou des tableaux à quatre dimensions peut également écrire à zéro avant la couche suivante expansé toutes les marques.
2, étant donné que les besoins de chaque extension de la couche de re-tag, et chaque couche est le même point d'extension en longueur de transmission, de sorte que dans la dimension de longueur matrice à cinq dimensions quelque peu redondante, peut être éliminé.
3, pour déterminer la direction de la division, a écrit une longue déclaration de commutation pour juger, mais plus tard à changer de direction après chaque division il y a un modèle, qui est, après chaque divisé en une direction à gauche et à droite, la direction du 45 d' origine . direction d' origine si le sens inverse des aiguilles d'une montre après l'enregistrement d'un tableau, la direction de division de la direction d' origine et + 1mod8 + 7mod8. Cela simplifie la détermination de la direction.

code:

#include <iostream>
#include <string.h>
#include <queue>
#include <vector>
using namespace std;
struct Point{
	int x;
	int y;
	Point(int thex,int they)
	{
		x=thex,y=they;
	}
};
bool vis[400][400];
bool note[400][400][8][6][30];
queue<pair<Point,int>> qq;
int dx[]={0,-1,-1,-1,0,1,1,1};
int dy[]={1,1,0,-1,-1,-1,0,1};
int main(int argc, char** argv) {
	memset(vis,false,400*400*sizeof(bool));
	memset(note,false,400*400*8*6*30*sizeof(bool));
	int n;
	cin>>n;
	Point now(199,199);
	vector<int> length(n+1);
	for(int i=0;i<n;i++)
		cin>>length[i];
	int count=0,number=1;
	qq.push({now,0});
	note[now.x][now.y][0][length[0]][0]=true;
	for(int i=0;i<n;i++)
	{
		int num=0;
		for(int j=0;j<number;j++)
		{
			now=qq.front().first;
			int forword=qq.front().second;
			qq.pop();
			for(int k=0;k<length[i];k++)
			{
				now.x+=dx[forword];
				now.y+=dy[forword];
				if(!vis[now.x][now.y])
				{
					vis[now.x][now.y]=true;
					count++;
				}
			}
			if(!note[now.x][now.y][(forword+1)%8][length[i+1]][i])
			{
				note[now.x][now.y][(forword+1)%8][length[i+1]][i]=true;
				qq.push({now,(forword+1)%8});
				num++;
			}
			if(!note[now.x][now.y][(forword+7)%8][length[i+1]][i])
			{
				note[now.x][now.y][(forword+7)%8][length[i+1]][i]=true;
				qq.push({now,(forword+7)%8});
				num++;
			}
		}
		number=num;
	}
	cout<<count<<endl;
	return 0;
}
发布了25 篇原创文章 · 获赞 8 · 访问量 537

Je suppose que tu aimes

Origine blog.csdn.net/weixin_44034698/article/details/104873428
conseillé
Classement