C语言问题,高手进

2024-11-18 08:31:47
推荐回答(2个)
回答(1):

第1个东西没做过不过告诉你思路~设农夫为0,狼1,羊2,菜3,相邻的不可以在一起无聊是在岸上还是船上。所以你就以0开始搜,不达到要求的过,最后就会出来结果
迷宫问题我都做烂了你要的是4方向的吧,给你一个还不错的
#include
#include
#include
using namespace std;
void visit(int, int);
char mg[50][50];
int row,column;
int startI = 1, startJ = 1; // 入口
int endI = 7, endJ = 7; // 出口
int main(void) {
int i, j;
printf("输入长宽\n");
cin>>row>>column;
printf("输入迷宫(1为障碍,0为路)\n");
for(i = 0; i < row; i++)
for(j = 0; j < column; j++)
cin>>mg[i][j];
printf("输入迷宫起点(横纵)\n");
cin>>startI>>startJ;
printf("输入迷宫终点(横纵)\n");
cin>>endI>>endJ;
printf("显示迷宫:\n");
for(i = 0; i < row; i++) {
for(j = 0; j < column; j++)
if(mg[i][j] == '1')
printf("X");
else
printf(" ");
printf("\n");
}
if(mg[startI][startJ]=='1'||mg[endI][endJ]=='1')
{printf("输入的起点或终点有误!\n");
return 0;
}
visit(startI, startJ);
system("PAUSE");
return 0;
}
void visit(int i, int j) {
int m, n;
mg[i][j] = '2';
if(i == endI && j == endJ) {
printf("\n显示路径:\n");
for(m = 0; m < row; m++) {
for(n = 0; n < column; n++)
if(mg[m][n] == '1')
printf("X");
else if(mg[m][n] == '2')
printf(".");
else
printf(" ");
printf("\n");
}
}
if(mg[i][j+1] == '0') visit(i, j+1);
if(mg[i+1][j] == '0') visit(i+1, j);
if(mg[i][j-1] == '0') visit(i, j-1);
if(mg[i-1][j] == '0') visit(i-1, j);
mg[i][j] = '0';
}

回答(2):

我现在已经有8年没有摸过编程了,但是对于这几个问题我提出解决的办法,看看对你有什么帮助
我们把 狼编号为1 ,把羊编号为2,把菜编号为3 ,声明两个数组,先把数组一放上1,2,3,如果数组里的数组加起来是偶数那么就成立,然后就把数组里的数字用深度优先搜索遍历方法调动,并打印出相应的结果。这样就把问题解决了,
1 | 0 1 | 0 1 | 0 0 | 1 0 | 1
-4---》
2 | 0 0 | 2 2 | 0 2 | 0《5---6》 0 | 2
-1---》 《- -3--
3 | 0 3 | 0 0 | 3 0 | 3 0 | 3
-2---》
问题2的解决方法更简单
先建立一个9*10 二维数组,在相应的数组位置输入0,1 且把(0,X) (y,0)(9,X)(y,10)都填上1,第二步对数组进行递归筛查,对于那些坐标周围四个方向的数组相加大于3的坐标都填上1,直至吧所有的是死胡同都清除掉,最后留下来的就是一条通向出口的道路,如果有多条左边值小于2的那么就代表更多条通路,具体怎么算,自己细细一想就明白了。
1 1
1 0 1 1 1 1
0 0