P1238 走迷宫

[洛谷原题](https://www.luogu.org/problemnew/show/P1238)

AC___20

在这里插入图片描述

附代码
#include
using namespace std;
int a[20][20],map[20][20];
int sx,sy,ex,ey,xx,yy;
int past[400][2];
int flag=0;
int n,m;
int p;

int dx[4]= {0,1,0,-1};
int dy[4]= {1,0,-1,0};

void pr(int p) {

/*cout<<"p: "<<p<<endl;
*/
for(int i=1; i<=p; i++)
    cout<<"("<<past[i][1]<<","<<past[i][2]<<")"<<"->";
cout<<"("<<ex<<","<<ey<<")"<<endl;

/*for(int i=0; i<n; i++) {
    for(int j=0; j<m; j++)
        if(map[i][j]==1)	{
            if(i!=ex&&j!=ey) cout<<"("<<i<<","<<j<<")"<<"->";
            else cout<<"("<<ex<<","<<ey<<")"<<endl;
        }
}
map[20][20]=0;
*/

}
int dfs(int x,int y,int p) {

if((x==ex)&(y==ey)) {
    flag=1;
    pr(p);
    return 0;
}

for(int i=0; i<4; i++) {

    xx=x+dx[i];
    yy=y+dy[i];
    if(xx>0&&xx<=n&&yy>0&&yy<=m&&a[xx][yy]==1&&map[xx][yy]==0)  {

        past[p][1]=x,past[p][2]=y;

        /*cout<<"past["<<p<<"][1]"<<past[p][1]<<endl;
        cout<<"past["<<p<<"][2]"<<past[p][2]<<endl;
        */
        map[x][y]=1;

        dfs(xx,yy,p+1);
        map[x][y]=0;
    }

}

}
int main() {
/*freopen(“c:\luogutest\dataP1238.in”,“r”,stdin);
freopen(“c:\luogutest\dataP1238.out”,“w”,stdout);
*/

cin>>n>>m;
for(int i=1; i<=n; i++)
    for(int j=1; j<=m; j++)
        cin>>a[i][j];
cin>>sx>>sy;
cin>>ex>>ey;

if(sx==ex&&sy==ey) {
    cout<<"-1";
    return 0;
}

dfs(sx,sy,1);
/*	cout<<"flag: "<<flag<<endl;
*/
if(!flag) cout<<"-1";
return 0;

/*fclose(stdin);
fclose(stdout);
*/

}

错误1 (边界错)

在这里插入图片描述

错误2(二维数组遍历有问题)

本题用二维数组表示m行n列,且是从(1,1)点开始,优先顺序是:优先顺序:左、上、右、下
int dx[4]={0,-1,0,1}; //dx 代表行。 不是屏幕坐标,错误2的原因
int dy[4]={-1,0,1,0};// 四个方向,左上右下;dy代表列
在这里插入图片描述

在这里插入图片描述

错误3(行和列输入搞混了)

在这里插入图片描述

在这里插入图片描述

错误4(打印函数的边界错误)

在这里插入图片描述

AC___100

#include<iostream>
using namespace std;
int a[20][20],map[20][20];
int sx,sy,ex,ey,xx,yy;
int past[400][2];
int flag=0;
int n,m;
int p;

int dx[4]= {0,-1,0,1};
int dy[4]= {-1,0,1,0};
void pr(int p) {

	/*cout<<"p: "<<p<<endl;
	*/
	for(int i=1; i<p; i++)
		cout<<"("<<past[i][1]<<","<<past[i][2]<<")"<<"->";
	cout<<"("<<ex<<","<<ey<<")"<<endl;

	/*for(int i=0; i<n; i++) {
	    for(int j=0; j<m; j++)
	        if(map[i][j]==1)	{
	            if(i!=ex&&j!=ey) cout<<"("<<i<<","<<j<<")"<<"->";
	            else cout<<"("<<ex<<","<<ey<<")"<<endl;
	        }
	}
	map[20][20]=0;
	*/
}
int dfs(int x,int y,int p) {

	if((x==ex)&(y==ey)) {
		flag=1;
		pr(p);
		return 0;
	}

	for(int i=0; i<4; i++) {

		xx=x+dx[i];
		yy=y+dy[i];
		if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&a[xx][yy]==1&&map[xx][yy]==0)  {

			past[p][1]=x,past[p][2]=y;

			/*cout<<"past["<<p<<"][1]"<<past[p][1]<<endl;
			cout<<"past["<<p<<"][2]"<<past[p][2]<<endl;
			*/
			map[x][y]=1;

			dfs(xx,yy,p+1);
			map[x][y]=0;
		}

	}
}
int main() {
	/*freopen("c:\\luogutest\\dataP1238.in","r",stdin);
	freopen("c:\\luogutest\\dataP1238.out","w",stdout);
	*/

	cin>>n>>m;
	for(int i=1; i<=n; i++)
		for(int j=1; j<=m; j++)
			cin>>a[i][j];
	cin>>sx>>sy;
	cin>>ex>>ey;

	if(sx==ex&&sy==ey) {
		cout<<"-1";
		return 0;
	}

	dfs(sx,sy,1);
	/*	cout<<"flag: "<<flag<<endl;
	*/
	if(!flag) cout<<"-1";
	return 0;

	/*fclose(stdin);
	fclose(stdout);
	*/
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值