0
已解决
许金夫
初级天翼
初级天翼
这个是我们的作业题,我也想了很久,但是莫名其妙就是不对(我没交,连样例都没过)发现递推和递归的代码很容易找不到BUG
因为是作业题只要告诉我错在哪
#include <iostream>
using namespace std;
int dir[8][2] = {{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
int vis[10][10];
int map[10][10];
int sx,sy,ex,ey;
struct P{
int a, b;
}p[100];
bool in_bound(int x, int y) {
if(x>=0 && x<=8 && y>=0 && y<=8) return true;
return false;
}
int cnt = 0;
void dfs(int x, int y, int t) {//当前站在(x,y)上,是当前路径的第t步
p[t].a = x;
p[t].b = y;
if(in_bound(x, y) && map[x][y]==0 && vis[x][y]==0 && x==ex && y==ey) {
cnt ++;
if(cnt==6)return ;
for(int i=1; i<=t-1; i++)
cout <<"("<< p[i].a << "," << p[i].b <<")"<< "->";
cout <<"("<< p[t].a << "," << p[t].b <<")"<< endl;
return ;
}
for(int i=0; i<8; i++) {
int nx = x + dir[i][0], ny = y + dir[i][1];
if(vis[nx][ny]==0 && in_bound(nx, ny)) {
vis[nx][ny] = 1;
dfs(nx,ny,t+1);
vis[nx][ny] = 0;
}
}
}
int main() {
cin>>sx>>sy>>ex>>ey;
for(int i=1;i<=8;i++){
for(int j=1;j<=8;j++){
cin>>map[i][j];
}
}
dfs(sx,sy,1);
cout << cnt;
return 0;
}
许金夫在2020-04-12 16:38:44追加了内容
@王子健 你应该会吧
0
已采纳
王子健
初级天翼
初级天翼
我来了,这题我已经在你代码的基础上改了,并且AC了,如果你AC了,记得采纳我耶
错误1:bool函数错误,你的map数组是从1开始输入的,所以bool判断要判断x和y是否>=1,而不是0
错误2:dfs函数第一个判断为什么要那么多条件呢?不是只要到达终点就行了吗,所以只要判断x==ex && y==ey就行了
错误3:不是cnt == 6就return,是cnt > 5就return
错误4:dfs循环里面的判断少了个条件,题目里还说了,是0证明可以走,是1不能走,所以要加一个判断:map[nx][ny] == 0
错误5:main函数里需要标记一下起点,不然走了一圈又回到起点了,从而不会停下,所以要在dfs前面加一个vis[sx][sy] = 1;
应该没了,自己做一下吧,望采纳,谢谢
0
0