我的代码:
#include <iostream> using namespace std; int total = 0; //定义总数 int map[7][7] = { 0 }; //定义地图大小,为[7][7]是为防止越界(允许横/纵坐标出现6) int n, m, t; // 迷宫的长宽和障碍总数 int sx, sy, fx, fy; //起始坐标,终止坐标 int tx = 0, ty = 0; //定义障碍物坐标 int dx[4] = { 0,0,1,-1 }; //定义行动的横坐标数组 int dy[4] = { -1,1,0,0 }; //定义行动的纵坐标数组 void walk(int x,int y) { if (x == fx && y == fy) //如果走到了终止坐标,则可行的路径taotal累加 { total++; return; //返回,继续下一次的搜索 } else { for (int i = 0; i < 4; i++) //代表上下左右4个方向 { if(map[x + dx[i]][y + dy[i]] == 1) //如果下一个要走的地方,没有走过并且没障碍 { map[x][y] =0; //将走过的部分打上标记0,代表走过(视为障碍),ps:运行到这里表示已经走过了map[x][y] walk(x + dx[i], y + dy[i]); map[x][y]= 1; //递归返回后,还原标记1,方便循环的下一次查找 } } } } int main() { cin >> n >> m >> t; for (int i = 1; i <=n; i++) { for (int j = 1; j <=m; j++) { map[i][j] = 1; //将迷宫能走的部分刷成1; } } cin >> sx >> sy >> fx >> fy; for (int i = 0; i < t; i++) { cin >> tx >> ty; map[tx][ty] = 0; //将迷宫障碍物部分刷成0; } walk(sx, sy); cout << total; return 0; }
根据我的代码,所知道的样例的迷宫样式:
黄色的部分为地图有效区,肉色的为无效区(被设置为0)
为什么不会被越界?
答:不会越界的,地图最大边长是 5,然后设置的map[7][7],map数组有效范围是[1][1]~[5][5],其余的都为0,代表地图边界,也就被当做障碍了,如果遇到[0][0]或[6][6],由于是0,会被当做障碍,也就不会走的。
总之就是因为地图边界被设置为0,遇到边界根本不会走(根据if那个判断),也就不会越界
参考的代码:
#include<iostream>//个人建议不使用万能头文件,如果要使用万能头文件,就不能定义数组map; #include<cstdlib> #include<cstdio> #include<cmath> using namespace std; int map[6][6];//地图; bool temp[6][6];//走过的标记; int dx[4]={0,0,1,-1};//打表; int dy[4]={-1,1,0,0};//打表; int total,fx,fy,sx,sy,T,n,m,l,r;//total计数器,fx,fy是终点坐标,sx,sy是起点坐标,T是障碍总数,n,m是地图的长和宽,l,r是障碍的横坐标和纵坐标; void walk(int x,int y)//定义walk; { if(x==fx&&y==fy)//fx表示结束x坐标,fy表示结束y坐标; { total++;//总数增加; return;//返回,继续搜索; } else { for(int i=0;i<=3;i++)//0——3是左,右,下,上四个方向; { if(temp[x+dx[i]][y+dy[i]]==0&&map[x+dx[i]][y+dy[i]]==1)//判断没有走过和没有障碍; { temp[x][y]=1;//走过的地方打上标记; walk(x+dx[i],y+dy[i]); temp[x][y]=0;//还原状态; } } } } int main() { cin>>n>>m>>T;//n,m长度宽度,T障碍个数 for(int ix=1;ix<=n;ix++) for(int iy=1;iy<=m;iy++) map[ix][iy]=1;//把地图刷成1; cin>>sx>>sy;//起始x,y cin>>fx>>fy;//结束x,y for(int u=1;u<=T;u++) { cin>>l>>r;//l,r是障碍坐标; map[l][r]=0; } walk(sx,sy); cout<<total;//输出总数; return 0; }