我需要做以下事情:
被认为是大小nxn的棋盘,他们愿意有障碍。需要打印移动狂人所需的最小移动次数,遵守国际象棋规则并避开障碍,从初始位置到最终位置。据信傻瓜的初始和最终位置没有障碍。
这是我的代码:
#include <fstream>
using namespace std;
#define INF 9999
int a[100][100];
int c[100][100];
int ip, jp, is, js;
int i,j;
int m, n;
const int di[] = { -1, 0, 1, 0 },
dj[] = { 0, 1, 0, -1 };
bool OK( int i, int j );
void Lee();
void Write();
void Read();
int main()
{
Read();
Lee();
Write();
return 0;
}
void Read()
{
ifstream fin("lee.in");
fin >> n >> m;
fin >> ip >> jp >> is >> js;
for ( int i = 0; i < n; i++ )
for ( int j = 0; j < m; j++ )
{
fin >> a[i][j];
c[i][j] = INF;
}
fin.close();
}
bool OK()
{
if ( a[i][j] == 1 ){ return false;} // obstacol, marcat de cifra 1 aici.
if ( i < 0 || j < 0 || i >= n || j >= m ){}
return false; // in afara matricei
return true; // niciuna din conditiile de mai sus nu au fost adevarate.
}
void Lee()
{
c[ip][jp] = 0; // punctul de plecare. distanta pana la el fiind de 0.
bool modif;
int pas = 0; // numarul de pasi efectuati.
do
{
modif = false;
for ( int i = 0; i < n; i++ )
for ( int j = 0; j < m; j++ )
if ( c[i][j] == pas )
for ( int d = 0; d < 4; ++d )
{
int iv = i + di[d];
int jv = j + dj[d];
if ( OK( iv, jv) )
{
c[iv][jv] = pas + 1;
modif = true;
if ( iv == is && jv == js )
return;
}
}
pas++;
} while ( modif );
}
void Write()
{
for ( int i = 0; i < n; i++ )
{
for ( int j = 0; j < m; j++ )
fout << c[i][j] << ' ';
fout << '\n';
}
fout >> c[is][js];
}
我有3个错误“'fout'未在此范围内声明”,我不知道是什么原因。
答案 0 :(得分:3)
在代码中的适当位置使用ofstream fout(filename);
声明fout。
答案 1 :(得分:0)
if ( i < 0 || j < 0 || i >= n || j >= m ){}
return false; // in afara matricei
return true; // niciuna din conditiile de mai sus nu au fost adevarate.
当条件为真时,if
会执行{}
,因此return false
将始终执行。
删除if
。