private static GuichesSetup[] carregarSetup()
        {
            System.IO.StreamReader file = new System.IO.StreamReader("Dados/Setup.txt");//busca o arquivo de texto
            int counter = 0;

            postos = new char[20];
            posto  = new int[20];
            string line;                             //cria uma string que recebe as linhas

            string[] setup;                          //declara o vetor de setup
            setup = new string[50];                  //declara que setup terá 9 posições
            while ((line = file.ReadLine()) != null) //laço que le linha por linha
            {
                if (counter == 0)
                {
                    atendente = Convert.ToInt32(line);
                    //MessageBox.Show(Convert.ToString(atendente));
                }
                else if (counter == 1)
                {
                    var vetor_aux = line.ToCharArray();
                    postos = new char[20];
                    int condicional = 0, k = 0;

                    for (int i = 0; i < vetor_aux.Length; i++)
                    {
                        if (vetor_aux[i] == ':')
                        {
                            condicional = 1;
                        }
                        else if (condicional == 1)
                        {
                            postos[k] = vetor_aux[i];
                            k++;
                        }
                    }
                    //string temp = new string(postos);
                    //MessageBox.Show(temp);
                }
                else if (counter == 2)
                {
                    var vetor_aux = line.ToCharArray();
                    atendente_pos = new char[20];
                    int condicional = 0, k = 0;

                    for (int i = 0; i < vetor_aux.Length; i++)
                    {
                        if (vetor_aux[i] == ':')
                        {
                            condicional = 1;
                        }
                        else if (condicional == 1)
                        {
                            atendente_pos[k] = vetor_aux[i];
                            k++;
                        }
                    }
                    //string temp = new string(atendente_pos);
                    //MessageBox.Show(temp);
                }
                else if (counter == 3)
                {
                    var    vetor_aux = line.ToCharArray();
                    char[] numfinal;
                    numfinal = new char[10];
                    int condicional = 0, k = 0;
                    for (int i = 0; i < (vetor_aux.Length); i++)
                    {
                        if (condicional == 1)
                        {
                            numfinal[k] = vetor_aux[i];
                            k++;
                        }
                        else if (vetor_aux[i] == ':')
                        {
                            condicional = 1;
                        }
                    }
                    string temp = new string(numfinal);
                    troca = Convert.ToInt32(temp);
                    //MessageBox.Show(Convert.ToString(troca));
                }
                else if (counter >= 4)
                {
                    var    vetor_aux = line.ToCharArray();
                    char[] numfinal;
                    numfinal = new char[10];
                    int k = 0, condicional = 0;
                    for (int i = 0; i < (vetor_aux.Length); i++)
                    {
                        if (vetor_aux[i] == ':')
                        {
                            condicional = 1;
                        }

                        else if (i > 0 && condicional != 1)
                        {
                            numfinal[k] = vetor_aux[i];
                            k++;
                        }
                    }

                    string temp = new string(numfinal);
                    posto[counter - 4] = Convert.ToInt32(temp);
                    //MessageBox.Show(Convert.ToString(posto[counter-4]));
                }


                counter++;//aumenta o contador para ler e armazenar novas linhas até o fim do arquivo(!=null)
            }

            //obtendo a quantidade de guiches (metodo provisorio enquanto não arruma a classe)
            int    quantidade = 0;
            String auxiliar   = "";

            for (int i = 0; i < 20; i++)
            {
                auxiliar += postos[i];
            }
            auxiliar   = new String(auxiliar.Where(Char.IsLetter).ToArray());
            quantidade = auxiliar.Length;

            //criando as classes setupguiches
            GuichesSetup[] guichesSetup;
            guichesSetup = new GuichesSetup[quantidade];

            //setando os guiches
            int  j   = 0;
            char aux = 'x'; //serve para guardar o char do ultimo posto, para comparar com o que vai ser lido atualmente

            for (int i = 0; i < quantidade; i++)
            {
                guichesSetup[i] = new GuichesSetup();

                guichesSetup[i].guiche = postos[i]; //simplesmente joga o char do guiche

                //isso serve para verificar quantos guiches iguais tem, assim o primeiro guiches dos iguais (por exemplo, 3 guiches A's, o primeiro A terá a quantidadeGuiches igual a 3)
                if (guichesSetup[i].guiche != aux)
                {
                    int k = i + 1;
                    aux = guichesSetup[i].guiche;

                    while (postos[k] == aux)
                    {   //atualizando a quantidade de guiches iguais (somente no primeiro guiche)
                        guichesSetup[i].guichesIguais++;
                        k++;
                    }
                }

                //colocando os atendentes nos devidos guiches
                if (atendente_pos[j] == guichesSetup[i].guiche)
                {
                    guichesSetup[i].atendente = true;
                    j++;
                }



                if (guichesSetup[i].guiche == 'A')
                {
                    guichesSetup[i].turnosNecessarios = posto[0];
                }
                if (guichesSetup[i].guiche == 'B')
                {
                    guichesSetup[i].turnosNecessarios = posto[1];
                }
                if (guichesSetup[i].guiche == 'C')
                {
                    guichesSetup[i].turnosNecessarios = posto[2];
                }
                if (guichesSetup[i].guiche == 'D')
                {
                    guichesSetup[i].turnosNecessarios = posto[3];
                }
                if (guichesSetup[i].guiche == 'E')
                {
                    guichesSetup[i].turnosNecessarios = posto[4];
                }
                if (guichesSetup[i].guiche == 'F')
                {
                    guichesSetup[i].turnosNecessarios = posto[5];
                }
                if (guichesSetup[i].guiche == 'G')
                {
                    guichesSetup[i].turnosNecessarios = posto[6];
                }
                if (guichesSetup[i].guiche == 'H')
                {
                    guichesSetup[i].turnosNecessarios = posto[7];
                }
                if (guichesSetup[i].guiche == 'I')
                {
                    guichesSetup[i].turnosNecessarios = posto[8];
                }
                if (guichesSetup[i].guiche == 'J')
                {
                    guichesSetup[i].turnosNecessarios = posto[9];
                }
                if (guichesSetup[i].guiche == 'K')
                {
                    guichesSetup[i].turnosNecessarios = posto[10];
                }
                if (guichesSetup[i].guiche == 'L')
                {
                    guichesSetup[i].turnosNecessarios = posto[11];
                }
                if (guichesSetup[i].guiche == 'M')
                {
                    guichesSetup[i].turnosNecessarios = posto[11];
                }
            }
            file.Close();//fecha o txt

            atendentesIniciais = new Boolean[guichesSetup.Length];
            for (int k = 0; k < guichesSetup.Length; k++)
            {
                atendentesIniciais[k] = guichesSetup[k].atendente;
            }


            return(guichesSetup);
        }
 private static void entrarGuiches(Pessoas pessoa, GuichesSetup guiche)
 {
     guiche.vazio        = false;
     guiche.pessoaDentro = pessoa;
 }
        private static GuichesSetup[] AleatorizarSetup()
        {
            Random rand = new Random();//cria variavel random


            /*============================================================*/
            /*======================Número de Postos======================*/
            /*============================================================*/


            int num_postos = rand.Next(6, 20);         //declara que o numero de guiches sera um numero entre 6 e 20
            int postos_dif = rand.Next(3, num_postos); //declara o numero de postos diferentes, exemplo, A B C D E, sendo que os postos poderão ser entre A até E no máximo


            /*============================================================*/
            /*=======================Atendentes===========================*/
            /*============================================================*/


            atendente = rand.Next(3, num_postos);//declara que os atendentes são um número entre 3 e o numero de postos.


            /*============================================================*/
            /*====================Relação de Postos=======================*/
            /*============================================================*/


            postos = new char[num_postos];       //postos recebe o tamanho do numero de postos(aleatorizado logo acima)
            for (int i = 0; i < postos_dif; i++) //esse for adiciona uma de cada letra aos postos, para que, por exemplo, não corra o risco de não ter uma letra A
            {
                postos[i] = Convert.ToChar(65 + i);
            }
            for (int i = postos_dif; i < num_postos; i++)//esse for adiciona os postos respetidos, caso haja espaço(o número de postos diferentes ser diferente do numero de postos)
            {
                postos[i] = (char)rand.Next(65, 65 + postos_dif);
            }
            Array.Sort(postos);//Organiza os postos


            /*============================================================*/
            /*===================Relação de Atendentes====================*/
            /*============================================================*/


            int[] dif_postos = new int[postos_dif];     //cria um vetor do tamanho de postos diferentes
            Array.Clear(dif_postos, 0, postos_dif - 1); //zera o vetor
            int  o = 0, j = 0;
            char a = 'A';

            while (o < num_postos) //cria um vetor dizendo a quantidade de cada um dos postos(EX: [2 postos A , 3 postos B , 4 postos C])
            {
                if (postos[o] == a)
                {
                    dif_postos[j]++;
                }
                else
                {
                    j++;
                    a++;
                    dif_postos[j]++;
                }
                o++;
            }

            j = 0;
            int aux = atendente;

            atendente_pos = new char[atendente];
            while (aux != 0)//distribui os atendentes entre os postos até que não sobre atendentes
            {
                o = rand.Next(0, postos_dif - 1);

                if (dif_postos[o] != 0)
                {
                    dif_postos[o]--;
                    atendente_pos[j] = Convert.ToChar(65 + o);
                    aux--;
                    j++;
                }
            }
            Array.Sort(atendente_pos);


            /*============================================================*/
            /*====================Tempo de cada posto=====================*/
            /*============================================================*/


            posto = new int[num_postos];
            for (int i = 0; i < posto.Length; i++)
            {
                posto[i] = rand.Next(1, 9);
            }


            /*============================================================*/
            /*======================Tempo de troca========================*/
            /*============================================================*/

            troca = rand.Next(1, 5);

            a = 'A';

            GuichesSetup[] guichesSetup;
            guichesSetup = new GuichesSetup[num_postos];

/*
 *          Console.WriteLine("atendente = "+atendente);
 *          Console.WriteLine("troca = " + troca);
 *          for(int i=0;i<postos.Length;i++)
 *          {
 *              Console.Write(postos[i]);
 *          }
 *          Console.WriteLine();
 *          for (int i = 0; i < atendente_pos.Length; i++)
 *          {
 *              Console.Write(atendente_pos[i]);
 *          }
 *          Console.WriteLine();
 *          a = 'A';
 *          for (int i = 0; i < posto.Length; i++)
 *          {
 *              Console.WriteLine("posto "+a+" = " + posto[i]);
 *              a++;
 *          }
 */
            j = 0;
            char aux2 = 'x'; //serve para guardar o char do ultimo posto, para comparar com o que vai ser lido atualmente

            for (int i = 0; i < guichesSetup.Length; i++)
            {
                guichesSetup[i]        = new GuichesSetup();
                guichesSetup[i].guiche = postos[i];

                if (guichesSetup[i].guiche == 'A')
                {
                    guichesSetup[i].turnosNecessarios = posto[0];
                }
                if (guichesSetup[i].guiche == 'B')
                {
                    guichesSetup[i].turnosNecessarios = posto[1];
                }
                if (guichesSetup[i].guiche == 'C')
                {
                    guichesSetup[i].turnosNecessarios = posto[2];
                }
                if (guichesSetup[i].guiche == 'D')
                {
                    guichesSetup[i].turnosNecessarios = posto[3];
                }
                if (guichesSetup[i].guiche == 'E')
                {
                    guichesSetup[i].turnosNecessarios = posto[4];
                }
                if (guichesSetup[i].guiche == 'F')
                {
                    guichesSetup[i].turnosNecessarios = posto[5];
                }
                if (guichesSetup[i].guiche == 'G')
                {
                    guichesSetup[i].turnosNecessarios = posto[6];
                }
                if (guichesSetup[i].guiche == 'H')
                {
                    guichesSetup[i].turnosNecessarios = posto[7];
                }
                if (guichesSetup[i].guiche == 'I')
                {
                    guichesSetup[i].turnosNecessarios = posto[8];
                }
                if (guichesSetup[i].guiche == 'J')
                {
                    guichesSetup[i].turnosNecessarios = posto[9];
                }
                if (guichesSetup[i].guiche == 'K')
                {
                    guichesSetup[i].turnosNecessarios = posto[10];
                }
                if (guichesSetup[i].guiche == 'L')
                {
                    guichesSetup[i].turnosNecessarios = posto[11];
                }
                if (guichesSetup[i].guiche == 'M')
                {
                    guichesSetup[i].turnosNecessarios = posto[12];
                }

                //isso serve para verificar quantos guiches iguais tem, assim o primeiro guiches dos iguais (por exemplo, 3 guiches A's, o primeiro A terá a quantidadeGuiches igual a 3)
                if (guichesSetup[i].guiche != aux2)
                {
                    int k = i + 1;
                    aux2 = guichesSetup[i].guiche;

                    while (k < guichesSetup.Length && postos[k] == aux2)
                    {   //atualizando a quantidade de guiches iguais (somente no primeiro guiche)
                        guichesSetup[i].guichesIguais++;
                        k++;
                    }
                }

                //colocando os atendentes nos devidos guiches
                if (j < atendente_pos.Length && atendente_pos[j] == guichesSetup[i].guiche)
                {
                    guichesSetup[i].atendente = true;
                    j++;
                }
            }

            atendentesIniciais = new Boolean[guichesSetup.Length];
            for (int k = 0; k < guichesSetup.Length; k++)
            {
                atendentesIniciais[k] = guichesSetup[k].atendente;
            }



            return(guichesSetup);
        }
        static int processo(Queue <Pessoas>[] fila, Pessoas[] pessoas, GuichesSetup[] guiches, int formula)
        {
            GuichesSetup.resetGuiches(guiches, atendentesIniciais);

            int turno = 1;
            //obtendo a quantidade de guiches

            int quantidadeFilas = 0;
            int i = 0;

            while (i < guiches.Length)
            {
                i += guiches[i].guichesIguais;
                quantidadeFilas++;
            }

            i = 0;

            //esse laço vai até entrar todas as pessoas nas filas
            while (i < pessoas.Length)
            {
                //jogando as pessoas na fila do guiche A (ou dos guiches A)
                while (pessoas[i].chegada == turno)
                {
                    fila[0].Enqueue(pessoas[i]);
                    i++;
                    if (i >= pessoas.Length)
                    {
                        break;                      //quando o i for maior do que a quantidade de pessoas
                    }
                }

                //jogando as primeiras pessoas das filas nos guiches
                atualizarFilas(guiches, fila);

                //atualizando os guiches e jogando as pessoas pras respectivas filas
                atualizarGuiches(guiches, fila);

                //Verificando se vale a pena fazer trocas
                if (formula == 1)
                {
                    Trocas.realizarTrocas1(guiches, fila, troca);
                }
                if (formula == 2)
                {
                    Trocas.realizarTrocas2(guiches, fila, troca);
                }

                //jogando as primeiras pessoas das filas nos guiches
                atualizarFilas(guiches, fila);


                turno = contarTurnos(turno);
            }


            //esse laço vai até esvaziar todos os guiches, assim, terminando
            Boolean continuar = true;

            while (continuar)
            {
                //jogando as primeiras pessoas das filas nos guiches
                atualizarFilas(guiches, fila);

                //atualizando os guiches e jogando as pessoas pras respectivas filas
                atualizarGuiches(guiches, fila);

                //Verificando se vale a pena fazer trocas
                if (formula == 1)
                {
                    Trocas.realizarTrocas1(guiches, fila, troca);
                }
                if (formula == 2)
                {
                    Trocas.realizarTrocas2(guiches, fila, troca);
                }

                //jogando as primeiras pessoas das filas nos guiches
                atualizarFilas(guiches, fila);

                //testando se todos os guiches estão vazios, se algum não estiver vazio, então continuar se torna verdade
                continuar = false;
                for (int j = 0; j < guiches.Length; j++)
                {
                    if (guiches[j].vazio == false)
                    {
                        continuar = true;
                    }
                }

                if (continuar == false && troca != 0)
                {
                    continuar = Trocas.condicaoEspecial(guiches, fila);
                }

                turno = contarTurnos(turno);
            }
            return(turno);
        }