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!
3 Réponses :
#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.
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; }
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;
}
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écouvrezstd :: getline
etstd :: istringstream
.