您的位置:首页 > 编程语言 > C语言/C++

2016蓝桥杯C/C++省赛 卡片换位(深搜DFS)

2017-03-25 17:18 232 查看
题目:



思路:

这题麻烦的一点在于处理输入和标记状态,以空格为点走,如果下一步是A点那么就让A走一格和空格换位,对于B点同理。注意在搜索的时候注意返回条件和判断是否越界

代码:

#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define M 1000000+10
#define ll long long
using namespace std;
int go[4][2]= {0,1,0,-1,1,0,-1,0};//方向向量
int minn=inf;
int vis[3][3][3][3][3][3];//标记数组
struct node
{
int x;
int y;
} a,b,k;//分别记录a,b和空格的坐标
void input()//处理输入
{
char s;
for(int i=0; i<2; i++)
{
for(int j=0; j<3; j++)
{
s=getchar();
if(s==' ')
{
k.x=i;
k.y=j;
}
if(s=='A')
{
a.x=i;
a.y=j;
}
if(s=='B')
{
b.x=i;
b.y=j;
}
}
getchar();
}
}
void dfs(int x1,int y1,int x2,int y2,int x,int y,int step)
{
if(step>minn)
return;
if(x1==b.x&&y1==b.y&&x2==a.x&&y2==a.y)
{
minn=min(minn,step);
return;
}
//判断越界
if(x<0||x>1||y<0||y>2)
return;
if(x1<0||x1>1||y1<0||y1>2)
return;
if(x2<0||x2>1||y2<0||y2>2)
return;
if(vis[x1][y1][x2][y2][x][y]==1)
return;

vis[x1][y1][x2][y2][x][y]=1;//标记
for(int i=0; i<4; i++)
{
int xx=x+go[i][0];
int yy=y+go[i][1];
if(xx==x1&&yy==y1)
dfs(x,y,x2,y2,x1,y1,step+1);
else if(xx==x2&&yy==y2)
dfs(x1,y1,x,y,x2,y2,step+1);
else
dfs(x1,y1,x2,y2,xx,yy,step+1);
}
vis[x1][y1][x2][y2][x][y]=0;
}
int main()
{
mem(vis,0);
input();
dfs(a.x,a.y,b.x,b.y,k.x,k.y,0);
printf("%d\n",minn);
return 0;
}


PS:惭愧啊。。这题找了3个小时Bug结果是一个判断越界的条件没加导致程序一直崩找不到原因,以后要注意心细一点。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: