Je n'ai pas pu améliorer mes compétences en raison d'un travail acharné ces jours-ci. Pour une raison quelconque, je suis plus occupé qu'avant le télétravail, même s'il est devenu mon télétravail chéri depuis longtemps. Et surtout, l'idée d'un programme pour éteindre un dinosaure est en train de disparaître. J'ai appris plus récemment
Ensuite, j'ai trouvé "Hebi" dans le test de compétence.
J'ai aimé le titre que je lui ai donné et je me sentais destiné, alors J'ai écrit un processus pour le résoudre.
Et plus le rang est élevé, plus l'énoncé du problème est long et plus __ "Pouvez-vous suivre le degré de compréhension et sa vision du monde?" __. __ "Le but est de résoudre le problème" Pour ceux qui veulent la beauté et la brièveté du code, les phrases suivantes sont inutiles. __
Enfin, je vais mettre un code sale. Et __ "N'acceptez pas les titres qui vous rendent nostalgique et froid" __ Commençons par réfléchir.
Essayez de coller le problème avec une image.
Les informations affichées sur la première ligne sont les largeurs verticale et horizontale dans lesquelles le serpent peut se déplacer. Soit y la verticale et x l'horizontale 0 <= y <= H-1,0 <= x <= W-1 est la plage mobile.
Le mur est représenté par #, et s'il l'est, il peut être déplacé. Ce que vous pouvez voir ici, c'est que si 2.1 n'est pas satisfait, c'est NG, Si 2.2 n'est pas satisfait, c'est NG, et si les deux sont satisfaits, c'est OK.
La fonction check_limit a été créée en tant que fonction pour juger de ce qui précède.
Ici, quand on leur donne la direction (direction face) et la direction à prendre, Dans quelle mesure les coordonnées de destination de la transition sont dans les directions des lignes et des colonnes par rapport aux coordonnées actuelles Déplacez-vous ou vérifiez la direction suivante.
Dans la figure, la relation est la suivante.
Lorsque vous vous déplacez vers la droite, déplacez-vous vers la droite de l'endroit où vous vous trouvez, c'est-à-dire 0 ligne et 1 colonne. La prochaine direction est l'est. Lorsque vous vous déplacez vers la gauche, déplacez-vous vers la gauche de l'endroit où vous vous trouvez, c'est-à-dire déplacez 0 lignes-1 colonnes. La prochaine direction est l'ouest. Si l'orientation n'est pas spécifiée (c'est le cas lorsque ce n'est pas le moment de changer de direction, défini sur aucune), remontez d'où vous êtes, c'est-à-dire déplacez -1 ligne 0 colonne. La prochaine direction est le nord.
Lorsque vous vous déplacez vers la droite, déplacez d'une ligne (en bas) 0 colonnes de l'endroit où vous vous trouvez La prochaine direction est le sud. En allant vers la gauche, déplacez -1 ligne (vers le haut) 0 colonnes de l'endroit où vous vous trouvez. La prochaine direction est le nord. Lorsque l'orientation est nulle, déplacez 0 ligne et 1 colonne (à droite) de l'endroit où vous vous trouvez. La prochaine direction est l'est.
La fonction check_direction a été créée sur la base de ces informations. (Je me rends compte maintenant qu'il vaut mieux obtenir que vérifier.)
Les coordonnées que j'ai passées une fois ne peuvent pas être avancées car il y a déjà un corps de serpent. Cette chose. Apparemment, il est censé être un énorme serpent comme Anakonda. Si la destination de transition est déjà passée, le mouvement s'arrêtera.
__ Flux global
__
(1) Obtenir la valeur d'entrée
(2) Tableau temporel (tableau tarr) pour changer de direction et tableau de direction correspondant (lrarr) Et le processus d'organisation de l'acquisition de données de coordonnées (tableau arr2)
"(3) Création d'un jugement sans issue des coordonnées et fonction d'acquisition des coordonnées de mouvement et de la direction du mouvement"
(4) Répétez ce qui suit de 0 à 99 '
(I) Trouver les coordonnées de destination de la transition (ny, nx) et la direction suivante (next_dir) pour la direction faisant face aux coordonnées actuelles (sy, sx) et la direction de déplacement ''
(Ii) Vérifiez si les coordonnées de destination de la transition sont des impasses (s'il y a une impasse, quittez la boucle)
(Ⅲ) Si ce n'est pas une impasse, vérifiez si ce sont les coordonnées que vous avez passées jusqu'à présent
(Ⅳ) Si les coordonnées ne sont pas passées jusqu'à présent, définissez ces coordonnées comme (sy, sx) et stockez-les dans snake_arr. ''
(V) Dans le cas des coordonnées passées jusqu'ici (dans le cas des coordonnées enregistrées dans snake_arr) Quitter la boucle
(5) Assignez * aux données arr2 des coordonnées enregistrées dans le tableau snake_arr
(6) Sortie arr2`
#Dans votre langue préférée
# Let'Défi! !!
in1 = gets.chomp!
#puts(in1)
arr1=in1.split(' ')
#print(arr1)
row1=arr1[0].to_i
col1=arr1[1].to_i
sy=arr1[2].to_i
sx=arr1[3].to_i
num1=arr1[4].to_i
arr2 = Array.new(row1) { Array.new(col1,"") }
#print(arr2)
for i in 1..row1 do
tmp1=gets.chomp.to_s
for j in 1..col1 do
arr2[i-1][j-1]=tmp1[j-1...j]
end
end
tarr=[]
lrarr=[]
for i in 1..num1 do
tmp1=gets.chomp.to_s
arr3=tmp1.split(" ")
tarr.push(arr3[0].to_i)
lrarr.push(arr3[1])
#in3.push(tmp1)
end
def check_limit(arr0,i,j,row1,col1)
if i<0 or i>row1-1
flg=1
elsif j<0 or j>col1-1
flg=1
elsif arr0[i][j]=="#"
flg=1
else
flg=0
end
return flg
end
def check_direction(p_dir,rlstr)
retstr=""
if p_dir=="N"
if rlstr=="R"
retstr="0,1,E"
elsif rlstr=="L"
retstr="0,-1,W"
else
retstr="-1,0,N"
end
elsif p_dir=="S"
if rlstr=="R"
retstr="0,-1,W"
elsif rlstr=="L"
retstr="0,1,E"
else
retstr="1,0,S"
end
elsif p_dir=="E"
if rlstr=="R"
retstr="1,0,S"
elsif rlstr=="L"
retstr="-1,0,N"
else
retstr="0,1,E"
end
else
if rlstr=="R"
retstr="-1,0,N"
elsif rlstr=="L"
retstr="1,0,S"
else
retstr="0,-1,W"
end
end
return retstr
end
def find_lr(sarr,retarr,i2,num1)
rnum=-1
for i in 0..num1-1 do
if sarr[i]==i2
rnum=i
break
end
end
return retarr[rnum]
end
snake_arr=[]
snk_str=arr1[2]+" "+arr1[3]
snake_arr.push(snk_str)
#print(snake_arr)
p_dir='N'
flg_e=0
for i in 0..99 do
if tarr.count(i)==0
retstr=check_direction(p_dir,"none")
tmparr=retstr.split(",")
ny=tmparr[0].to_i+sy
nx=tmparr[1].to_i+sx
next_dir=tmparr[2]
flg=check_limit(arr2,ny,nx,row1,col1)
else
lrstr=find_lr(tarr,lrarr,i,num1)
retstr=check_direction(p_dir,lrstr)
tmparr=retstr.split(",")
ny=tmparr[0].to_i+sy
nx=tmparr[1].to_i+sx
next_dir=tmparr[2]
flg=check_limit(arr2,ny,nx,row1,col1)
end
if flg==0
sy=ny
sx=nx
p_dir=next_dir
str1=sy.to_s+" "+sx.to_s
if snake_arr.count(str1)==0
snake_arr.push(str1)
else
flg_e=1
#puts(1)
end
else
flg_e=1
#puts(2)
end
if flg_e==1
break
end
end
#print(snake_arr)
#print(snake_arr.length)
for i in 0..snake_arr.length-1 do
tmp1=snake_arr[i].to_s.split(" ")
arr2[tmp1[0].to_i][tmp1[1].to_i]="*"
end
str1=""
for i in 0..row1-1 do
str1=""
for j in 0..col1-1 do
str1=str1+arr2[i][j]
end
puts(str1)
end
Recommended Posts