下面是我写的代码。我必须为nXn编写它,但为了简单起见,我尝试为5X5测试它。它不显示我的输出...有人能告诉我下面的代码有什么问题吗?
{
#include <iostream>
#include <iomanip>
using namespace std;
void knight ( int startx, int starty, int n, int p[][5], int used [][5], int &count);
int main ( )
{
const int n = 5; // no. of cloumns and rows
int startx = 0;
int starty = 0;
int p[5][5];
int used[5][5];
int count = 1;
int i= 0;
int j = 0;
//initializing the array
for ( i = 0; i < 5; i++)
{
for ( j = 0; j < 5; j++)
{
p[i][j] = 0;
used [i][j] = 0;
}
}
//outputting the initialized array..
i=0;
while ( i< 5)
{
for ( j = 0; j < 5; j++)
{
cout << setw(3) << p[i][j];
}
i++;
cout << endl;
}
knight (startx,starty,n,p,used,count);
return 0;
}
void knight ( int x, int y, int n, int p[][5], int used [][5], int &count)
{
int i = 0;
//knight (x,y,n,p,used,count)
for ( i = 0; i < n*n; i++)
{
if ( used [x][y] == 0 )
{
used[x][y] = 1; // mark it used;
p[x][y] += count; //inserting step no. into the solution
//go for the next possible steps;
//move 1
//2 squares up and 1 to the left
if (x-1 < 0 && y+2 < n && p[x-1][y+2] == 0)
{
used[x-1][y+2] = 1;
p[x-1][y+2] += count;
knight (x-1,y+2,n,p,used,count);
used[x-1][y+2] = 0;
}
//move 2
//2 squares up and 1 to the right
if ( x+1 < n && y+2 < n && p[x+1][y+2] == 0 )
{
used[x+1][y+2] = 1;
p[x+1][y+2] += count;
knight (x+1,y+2,n,p,used,count);
used[x+1][y+2] = 0;
}
//move 3
//1 square up and 2 to the right
if ( x+2 < n && y+1 < n && p[x+2][y+1] == 0 )
{
used[x+2][y+1] = 1;
p[x+2][y+1] += count;
knight (x+2,y+1,n,p,used,count);
used[x+2][y+1] = 0;
}
//move 4
//1 square down and 2 to the right
if ( x+2 < n && y-1 < n && p[x+2][y-1] == 0 )
{
used[x+2][y-1] = 1;
p[x+2][y-1] += count;
knight (x+2,y-1,n,p,used,count);
used[x+2][y-1] = 0;
}
//move 5
//2 squares down and 1 to the right
if ( x+1 < n && y-2 < n && p[x+1][y-2] == 0 )
{
used[x+1][y-2] = 1;
p[x+1][y-2] += count;
knight (x+1,y-2,n,p,used,count);
used[x+1][y-2] = 0;
}
//move 6
//2 squares down and 1 to the left
if ( x-1 < n && y-2 < n && p[x-1][y-2] == 0 )
{
used[x-1][y-2] = 1;
p[x-1][y-2] += count;
knight (x-1,y-2,n,p,used,count);
used[x-1][y-2] = 0;
}
//move 7
//1 square down and 2 to the left
if ( x-2 < n && y-1 < n && p[x-2][y-1] == 0 )
{
used[x-2][y-1] = 1;
p[x-2][y-1] += count;
knight (x-2,y-1,n,p,used,count);
used[x-2][y-1] = 0;
}
//move 8
//one square up and 2 to the left
if ( x-2 < n && y+1< n && p[x-2][y+1] == 0 )
{
used[x-2][y+1] = 1;
p[x-2][y+1] += count;
knight (x-2,y+1,n,p,used,count);
used[x-2][y+1] = 0;
}
}
}
if ( x == n-1 && y == n-1)
{
while ( i != n)
{
for ( int j = 0; j < n; j++)
cout << setw(3) << p[i][j];
i++;
}
}
}谢谢你!!
发布于 2010-04-04 11:14:35
首先,一些编译器很挑剔,如果你的函数声明和定义中的变量名不同,它们会给你一个警告。
void knight ( int startx, int starty, int n, int p[][5], int used [][5], int &count);
[...]
void knight ( int x, int y, int n, int p[][5], int used [][5], int &count) { ... }其次,如果您试图将int指针传递给knight (参数为count),那么您将使用int *count。如果要在knight中使用递归,最好将count声明为全局变量,或者(如下所示)如果count参数仅对特定调用树有效,则您可能不希望使用指针,而只是为每个调用提供自己的count。
第三,文件顶部的恶意{是什么?你是故意把它放在那儿的吗?
当你运行这个程序时,它会做什么呢?您是否尝试过在代码的不同部分插入打印输出的调试消息,以便查看错误或无限循环发生的位置?
发布于 2010-04-04 11:20:37
这些都是代码中不同问题的提示:
在执行if ( x == n-1 && y == n-1)的程序中,i有什么价值?它是如何获得这个值的?
这个循环for ( i = 0; i < n*n; i++)到底有什么作用?
当你有一个像y-2 < n这样的表达式时,这真的是你想要的吗?y-2永远不能小于n吗
发布于 2010-04-12 04:05:39
我使用以下代码得到了答案:
#include <iostream>
#include <iomanip>
using namespace std;
bool move(int *p[] ,int x, int y,int n);
void knights (int *p[],int x,int y,int n, int count, int &pmt);
void output(int *p[],int n);
int main(char argc, char *argv[])
{
int count = 1;
int pmt = 0;
int n; //for size of board
int x,y; // starting pos
int **p; // to hold no. of combinations
if ( argc != 4)
{
cout << "Very few arguments. Please try again.";
cout << endl;
return 0;
}
n = atoi(argv[1]);
if( argv[1] <= 0 )
{
cout << " Invalid board size. ";
return 0;
}
x = atoi(argv[2]);
y = atoi(argv[3]);
cout << "board size: " << n << ", "<< n << endl;
cout << "starting pos: " << x << ", " << y << endl;
//dynamic allocation of arrays to hold permutation
p = new int *[n];
for (int i = 0; i < n; i++)
p[i] = new int [n];
//initializing board
int i, j;
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
p[i][j] = 0;
}
}
output(p,n); // check output format
knights(p,x,y,n,count,pmt);
cout << "no. perm " << pmt << endl;
return 0;
}
void output(int *p[],int n)
{
int i = 0;
int j;
while ( i != n)
{
for ( j=0; j<n; j++)
{
cout << setw(10) << p[i][j];
}
cout << endl;
i++;
}
}
bool move(int *p[],int x, int y,int n)
{
if (x < 0 || x >= n)
{
return false;
}
if ( y < 0 || y >= n)
{
return false;
}
if( p[x][y] != 0 )
{
return false;
}
return true;
}
void knights (int *p[], int x,int y,int n ,int count , int &pmt)
{
if(!move(p,x,y,n))
{
return;
}
if (count == n*n)
{
cout << "New solution found: " << endl <<endl;
p[x][y]=count;
output(p,n);
p[x][y]= 0;
pmt++;
}
if ( p[x][y] == 0 )
{
p[x][y] = count;
//move 1
knights (p, x-1, y-2, n, count+1, pmt);
//move 2
knights (p, x+1, y-2, n, count+1, pmt);
//move 3
knights (p, x+2, y-1, n, count+1, pmt);
//move 4
knights (p, x+2, y+1, n, count+1, pmt);
//move 5
knights (p, x+1, y+2, n, count+1, pmt);
//move 6
knights (p, x-1, y+2, n, count+1, pmt);
//move 7
knights (p, x-2, y+1, n, count+1, pmt);
//move 8
knights (p, x-2, y-1, n, count+1, pmt);
p[x][y] = 0; //setting square back to zero
}
}https://stackoverflow.com/questions/2573404
复制相似问题