我正在使用cout
和endl
打印一些指南,输出(我的意图)就像:
From Spot 1
Spot 2
Spot 5
Spot 8
Spot 6
To Spot 3
此处,Spot No.
是随机的,并且是从某些迭代中生成的。由于迭代,我只能打印结果:
From Spot 1
Spot 2
Spot 5
Spot 8
Spot 6
Spot 3
有没有方法可以删除我的上一个新行Spot 3
?
我想找到两个顶点之间的最短路径(使用Floyd-Warshall算法)。这是我的代码,它描述了以下gragh:
#include <iostream>
using namespace std;
const int INF = 100000;
int n = 10, path[11][11], dist[11][11], map[11][11];
void init() {
int i, j;
for ( i = 1; i <= n; i++ )
for ( j = 1; j <= n; j++ )
map[i][j] = ( i == j ) ? 0:INF;
map[1][2] = 2, map[1][4] = 20, map[2][5] = 1;
map[3][2] = 3, map[4][3] = 8, map[4][6] = 6;
map[4][7] = 4, map[5][3] = 7, map[5][8] = 3;
map[6][3] = 1, map[7][8] = 1, map[8][6] = 2;
map[8][10] = 2, map[9][7] = 2, map[10][9] = 1;
}
void floyd() {
int i, j, k;
for ( i = 1; i <= n; i++ )
for ( j = 1; j <= n; j++ )
dist[i][j] = map[i][j], path[i][j] = 0;
for ( k = 1; k <= n; k++ )
for ( i = 1; i <= n; i++ )
for ( j = 1; j <= n; j++ )
if ( dist[i][k] + dist[k][j] < dist[i][j] )
dist[i][j] = dist[i][k] + dist[k][j], path[i][j] = k;
}
void output( int i, int j ) {
if ( i == j ) return;
if ( path[i][j] == 0 ) cout << "Spot" << j << endl;
else {
output( i, path[i][j] ); // iterations
output( path[i][j], j );
}
}
int main() {
int u, v;
init();
floyd();
u = 1, v = 3;
if ( dist[u][v] == INF ) cout << "No path" << endl;
else {
cout << "From Spot" << u << endl;
output( u, v );
cout << endl;
}
return 0;
}
现在的问题是找到最后一次迭代的条件,以便我可以cout
一个不同的表达式。但我认为通过简单地删除最后一个表达式并重写来解决问题更容易,所以我没有附加我的代码。
我在Fabian Tamp的帮助下实现了我的目的,虽然看起来有点愚蠢我编写上面的代码。这是修改后的代码:
#include <iostream>
#include <queue>
using namespace std;
const int INF = 100000;
int n = 10, path[11][11], dist[11][11], map[11][11];
void init() {
int i, j;
for ( i = 1; i <= n; i++ )
for ( j = 1; j <= n; j++ )
map[i][j] = ( i == j ) ? 0:INF;
map[1][2] = 2, map[1][4] = 20, map[2][5] = 1;
map[3][3] = 3, map[4][3] = 8, map[4][6] = 6;
map[4][7] = 4, map[5][3] = 7, map[5][8] = 3;
map[6][3] = 1, map[7][8] = 1, map[8][6] = 2;
map[8][10] = 2, map[9][7] = 2, map[10][9] = 1;
}
void floyd() {
int i, j, k;
for ( i = 1; i <= n; i++ )
for ( j = 1; j <= n; j++ )
dist[i][j] = map[i][j], path[i][j] = 0;
for ( k = 1; k <= n; k++ )
for ( i = 1; i <= n; i++ )
for ( j = 1; j <= n; j++ )
if ( dist[i][k] + dist[k][j] < dist[i][j] )
dist[i][j] = dist[i][k] + dist[k][j], path[i][j] = k;
}
void output( int i, int j, queue<int> &output_queue ) {
if ( i == j ) return;
if ( path[i][j] == 0 ) output_queue.push(j);
else {
output( i, path[i][j], output_queue); // iterations
output( path[i][j], j, output_queue);
}
}
void print_path(queue<int> output_queue) {
if (output_queue.empty()) return;
int item = output_queue.front();
while (!output_queue.empty()) {
item = output_queue.front();
output_queue.pop();
if (output_queue.empty()) {
cout << "To ";
}
cout << "Spot " << item << endl;
}
}
int main() {
int u, v;
init();
floyd();
u = 1, v = 3;
if ( dist[u][v] == INF ) cout << "No path" << endl;
else {
cout << "From Spot " << u << endl;
queue<int> output_queue;
output(u, v, output_queue);
print_path(output_queue);
}
return 0;
}
输出在一开始就是指南。谢谢大家!
答案 0 :(得分:2)
如果您打印了多少行,则可以使用此宏
#define gotoxy(a,b) {COORD coord; coord.X=(b); coord.Y=(a) ; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);}
然后转到该行并打印“”以显示您打印的所有字符。
答案 1 :(得分:2)
改变你的输出功能:
void output( int i, int j, Queue<int> &output_queue ) {
if ( i == j ) return;
if ( path[i][j] == 0 ) output_queue.push(j);
else {
output( i, path[i][j], output_queue); // iterations
output( path[i][j], j, output_queue);
}
}
然后更改您的main()
:
//....
else {
Queue<int> output_queue;
output_queue.push(u);
output(u, v, output_queue);
print_path(output_queue);
}
//...
然后添加print_path
:
void print_path(Queue<int> output_queue) {
if (output_queue.empty()) return;
auto item = output_queue.front();
cout << "From Spot " << item << endl;
while (!output_queue.empty()) {
item = output_queue.front();
output_queue.pop();
if (output_queue.empty()) {
cout << "To ";"
}
cout << "Spot " << item << endl;
}
}
这里有几件事:
output_queue
的策略。请注意,我已经通过 copy 传递print_path()
,因为它会破坏参数中的数据。它是C ++中最强大的技术之一。答案 2 :(得分:0)
如果您不在每行后打印换行符,将会更容易。然后你可以返回并“删除”当前行上的文本,输出一些“\ b”(退格)字符,等于行上的字符数,然后是相同数量的空格(以消除什么在那里)。然后你可以通过写“\ r”返回到行的开头并再次写完整行。