1
votes

Comment puis-je prendre un nombre donné de listes de nombres comme entrée, si je ne sais pas combien de nombres y a-t-il dans chaque liste?

https://www.spoj.com/problems/TTRGRAPH/

J'essayais de résoudre le problème ci-dessus, dans les spécifications d'entrée, il y aura N lignes de nombres (chaque ligne peut avoir plus de 1 nombres). Comment puis-je prendre l'entrée (j'utilise C ++)? J'ai essayé de prendre l'entrée comme indiqué ci-dessous, mais tous les nombres sont poussés dans le premier vecteur.

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    vector<vector<int>> g(n);
    for(int i=0;i<n;i++)
    {
        int e;
        while(cin>>e and e!='\n')
            g[i].push_back(e);
    }
    for(int i=0;i<n;i++)
        cout<<g[i].size()<<' ';
    return 0;
}

Pour l'entrée:

4

1 2 3

0 2 3

0 1 3

0 1 2

La sortie I j'obtiens est:

12 0 0 0

Mais le résultat attendu devrait être:

3 3 3 3

Ce serait utile si quelqu'un peut suggérer quelque chose d'utile! Merci!


1 commentaires

La lecture d'un int ignore les espaces, y compris les retours à la ligne, et ne lit que les entiers. Votre comparaison sera vraie si un nombre que vous lisez se trouve être la représentation du caractère de nouvelle ligne. Découvrez std :: getline et std :: istringstream .


3 Réponses :


2
votes
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    vector<vector<string>> g(n);
    cin.ignore();
    for(int i=0;i<n;i++)
    {
        string e;
        getline(cin,e);
        stringstream ss;
        ss<<e;
        string temp;
        while(ss>>temp) g[i].push_back(temp);
    }
    for(int i=0;i<n;i++)
        cout<<g[i].size()<<' ';
    return 0;
}
for each value of n get all the inputs in the nth line and pass it to stringstream. Then extract each element from the stream and push it to the respective vector.

0 commentaires

2
votes

Une solution possible est d'utiliser cin.peek():

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    int n;
    cin >> n;
    vector<vector<int>> g(n);
    for (int i = 0; i < n; i++)
    {
        int e;
        while (cin >> e) {
            g[i].push_back(e);
            if (cin.peek() == '\n') break;
        }
        cin.clear();
        cin.ignore();
    }
    for (int i = 0; i < n; i++)
        cout << g[i].size() << ' ';
    return 0;
}


0 commentaires

-1
votes

Cela fonctionne avec un espace entre les nombres en entrée.

#include <stdio.h>
#include <istream>
#include <iostream>
#include <ostream>
#include <vector>

int main()
{
   int n;
   std::cin>>n;
   std::vector<std::vector<int>> g(n);

   for(int i=0;i<n;i++)
   {
        int e;
        while (std::cin >> e) {

           if(std::cin.peek() == ' ')
           {
               g[i].push_back(e);
           }

           if (std::cin.peek() == '\n')
           {
               g[i].push_back(e);
               break;
           }
       }
       std::cin.clear();
       std::cin.ignore();
   }

   for(int i=0;i<n;i++)
       std::cout<<g[i].size()<<' ';

   return 0;

}


0 commentaires