写在前面,这个是我最近帮我学弟做的一个作业,2020年6月份左右。在这个时间段不要直接复制提交呀,这样你们都会被认为作弊的。
随便找个c++的环境就可以跑这个程序。如果帮助到你,可以打赏杯咖啡吗。
#include <iostream>
#include <string>
using namespace std;
#define row 10
#define col 10
int matrix[row][col];
bool vis[row][col];
int r, c;
int countOne = 0;
string res;
int startRow, startCol;
int dR[4] = {0, 1, -1, 0};
int dC[4] = {1, 0, 0, -1};
bool getRes = false;
void input()
{
res.clear();
countOne = 0;
cout<<"输入图形的行数和列数"<<endl;
cin >> r >> c;
cout<<"输入图形(可以走标记为1,不可走为0,起始点为1)"<<endl;
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
{
cin >> matrix[i][j];
if (matrix[i][j] == 1)
{
countOne = countOne + 1;
}
vis[i][j] = false;
}
}
cout<<"输入起始点座标(下标形式)"<<endl;
cin >> startRow >> startCol;
}
void dfsAndTraceBack(int rIndex, int cIndex)
{
for (int i = 0; i < 4; i++)
{
if ((res.size() + 1) == countOne)
{
getRes = true;
return;
}
int tmpR = rIndex + dR[i];
int tmpC = cIndex + dC[i];
if (!(0 <= tmpR && tmpR < r))
{
continue;
}
if (!(0 <= tmpC && tmpC < c))
{
continue;
}
if (matrix[tmpR][tmpC] == 1 && vis[tmpR][tmpC] == false && !getRes)
{
switch (i)
{
case 0:
res = res + "R";
break;
case 1:
res = res + "D";
break;
case 2:
res = res + "U";
break;
case 3:
res = res + "L";
break;
default:
break;
}
vis[tmpR][tmpC] = true;
dfsAndTraceBack(tmpR, tmpC);
if(!getRes)
{
vis[tmpR][tmpC] = false;
res.pop_back();
}
}
}
}
void solve()
{
vis[startRow][startCol] = true;
dfsAndTraceBack(startRow, startCol);
}
int main()
{
input();
solve();
cout << res << endl;
return 0;
}