定义结构体
x,y是坐标,turn代表方向(1向下,2向上,3向右,4向左)
times表示转折次数
struct node
{
int x,y;
int turn;
int times;
};
st结构体是起点 en结构体是终点
visit数组表示是否经过这个点
先判断是否可以深搜 如果可以turn=times=0;
scanf("%d%d%d%d",&st.x,&st.y,&en.x,&en.y);
memset(visit,0,sizeof(visit));
visit[st.x][st.y]=1;
if(arr[st.x][st.y]==arr[en.x][en.y]&&arr[st.x][st.y])
{
st.turn=0;
st.times=0;
dfs(st);
}
先判断 转折超过两次就退出。
如果找到就flag=1;
if(pos.times>2)return ;
if(pos.x==en.x&&pos.y==en.y)
{
flag=0;
return ;
}
按照下0 上1 右2 左3 的顺序遍历
int lo[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
如果visit的值为1或是点的坐标不在矩阵内 执行下一个 i
反之 判断此时的方向与下一步将要走的方向是否一致
若一致,继承此时点的turn与times
不然 下一个点的turn=i+1;times++;
判断下一步的点是否数值为0或是与终点一样
for(int i=0;i<4;i++)
{
if(flag)
{
int x=pos.x+lo[i][0];
int y=pos.y+lo[i][1];
if(visit[x][y]||!check(x,y))continue ;
node now;
now.x=x;now.y=y;
if(pos.turn==1)
{
if(i!=0){now.turn=i+1;now.times=pos.times+1;}
else {now.times=pos.times;now.turn=pos.turn;}
}
else if(pos.turn==2)
{
if(i!=1){now.turn=i+1;now.times=pos.times+1;}
else {now.times=pos.times;now.turn=pos.turn;}
}
else if(pos.turn==3)
{
if(i!=2){now.turn=i+1;now.times=pos.times+1;}
else {now.times=pos.times;now.turn=pos.turn;}
}
else if(pos.turn==4)
{
if(i!=3){now.turn=i+1;now.times=pos.times+1;}
else {now.times=pos.times;now.turn=pos.turn;}
}
else
{
now.turn=i+1;
now.times=0;
}
if(arr[x][y]==0||(x==en.x&&y==en.y))
{
visit[x][y]=1;
dfs(now);
visit[x][y]=0;
}
}
}
判断条件不要写在一起,不然莫名其妙爆内存
AC:
#include<bits/stdc++.h>
using namespace std;
int m,n,k,flag=0;
int arr[1001][1001]={0};
struct node
{
int x,y;
int turn;
int times;
};
node st,en;
int lo[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int visit[1001][1001];
#define check(a,b) (a>=1&&a<=m&&b>0&&b<=n)
void dfs(node pos)
{
if(pos.times>2)return ;
if(pos.x==en.x&&pos.y==en.y)
{
flag=0;
return ;
}
for(int i=0;i<4;i++)
{
if(flag)
{
int x=pos.x+lo[i][0];
int y=pos.y+lo[i][1];
if(visit[x][y]||!check(x,y))continue ;
node now;
now.x=x;now.y=y;
if(pos.turn==1)
{
if(i!=0){now.turn=i+1;now.times=pos.times+1;}
else {now.times=pos.times;now.turn=pos.turn;}
}
else if(pos.turn==2)
{
if(i!=1){now.turn=i+1;now.times=pos.times+1;}
else {now.times=pos.times;now.turn=pos.turn;}
}
else if(pos.turn==3)
{
if(i!=2){now.turn=i+1;now.times=pos.times+1;}
else {now.times=pos.times;now.turn=pos.turn;}
}
else if(pos.turn==4)
{
if(i!=3){now.turn=i+1;now.times=pos.times+1;}
else {now.times=pos.times;now.turn=pos.turn;}
}
else
{
now.turn=i+1;
now.times=0;
}
if(arr[x][y]==0||(x==en.x&&y==en.y))
{
visit[x][y]=1;
dfs(now);
visit[x][y]=0;
}
}
}
return ;
}
int main()
{
freopen("C:\\Users\\Lenovo\\Desktop\\input.txt","r",stdin);
while(~scanf("%d%d",&m,&n)&&m&&n)
{
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
scanf("%d",&arr[i][j]);
}
}
scanf("%d",&k);
while (k--)
{
flag=1;
scanf("%d%d%d%d",&st.x,&st.y,&en.x,&en.y);
memset(visit,0,sizeof(visit));
visit[st.x][st.y]=1;
if(arr[st.x][st.y]==arr[en.x][en.y]&&arr[st.x][st.y])
{
st.turn=0;
st.times=0;
dfs(st);
}
if(flag)printf("NO\n");
else printf("YES\n");
}
}
}