问题标题: 酷町堂:求助~:5014 国际象棋

0
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
许金夫
许金夫
初级天翼
初级天翼

大家怎么都在回答天梯那个问题,来人呀!!!

我要回答