【发布时间】:2016-04-24 10:20:00
【问题描述】:
我需要做以下事情:
被认为是 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' is not declared in this scope”,我不知道是什么原因。
【问题讨论】:
-
你在哪里声明了
fout?我看不出来。 -
您的缩进使代码难以阅读。
-
@BrasoveanNicolae “我需要声明 fout 吗?” 当然,就像你已经正确使用
fin所做的一样,当然使用std::ofstream。 -
对于严重错误的格式应该有一个关闭选项。任何人都应该如何阅读该代码?
-
我不明白为什么有人会看到格式如此糟糕的代码并从字面上认为“好吧,太好了,我现在要把它放到互联网上供其他人阅读”。这是怎么回事?!
标签: c++