标签:
5 5 ..DSD ...D. C.... P.D.. ...M. 7 7 .DDSDD. ..DDD.. ...D... .....P. .C..... ...M... .......
Scenario #1 2 Scenario #2 OH!That‘s impossible!
分析:这是一个很好的搜索问题,不知为什么用cin就wa,换成%s就ac了,坑了一天,坑急眼了连饭都没吃。
广搜就是遍历车,马,炮所有的位置状态,开一个6维数组标记3个元素的位置,车,马比较好遍历,车4个方向,马8个·方向,炮除了可以和车一样走外
还可以,还可以“隔山打牛”。注意:马可以被拨马腿,炮不能走到帅的位置上。
代码示例:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
typedef struct
{
int xj,xm,xp;
int yj,ym,yp;
int step;
}node;
int map[11][11],dis[11][11][11][11][11][11];
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int dit[8][2]={{2,1},{1,2},{-2,1},{1,-2},{2,-1},{-1,2},{-2,-1},{-1,-2}};
int dic[8][2]={{1,0},{0,1},{-1,0},{0,-1},{1,0},{0,1},{-1,0},{0,-1}};
int N,M,ax,ay,bx,by,cx,cy,X,Y;
int min(int a,int b)
{
return a<b?a:b;
}
int max(int a,int b)
{
return a>b?a:b;
}
int bfs()
{
int num,h,t;
node fir,nex;
fir.xj=ax,fir.xm=bx,fir.xp=cx;
fir.yj=ay,fir.ym=by,fir.yp=cy;
fir.step=0;
dis[ax][ay][bx][by][cx][cy]=1;
queue<node>Q;
Q.push(fir);
while(!Q.empty())
{
fir=Q.front();
Q.pop();
map[fir.xj][fir.yj]=1;
map[fir.xm][fir.ym]=1;
map[fir.xp][fir.yp]=1;
for(int i=0;i<8;i++)
{
nex=fir;
nex.xm=fir.xm+dit[i][0];
nex.ym=fir.ym+dit[i][1];
nex.step=fir.step+1;
if((fir.xm+dic[i][0]==X)&&(fir.ym+dic[i][1]==Y))continue;
if(map[fir.xm+dic[i][0]][fir.ym+dic[i][1]])continue;
if(nex.xm>=1&&nex.xm<=N&&nex.ym>=1&&nex.ym<=M&&!map[nex.xm][nex.ym]&&!dis[nex.xj][nex.yj][nex.xm][nex.ym][nex.xp][nex.yp])
{
if(nex.xm==X&&nex.ym==Y)
{
return nex.step;
}
dis[nex.xj][nex.yj][nex.xm][nex.ym][nex.xp][nex.yp]=1;
Q.push(nex);
}
}
for(int i=0;i<4;i++)
{
nex=fir;
nex.xj=fir.xj+dir[i][0];
nex.yj=fir.yj+dir[i][1];
nex.step=fir.step+1;
while(1)
{
if(nex.xj>=1&&nex.xj<=N&&nex.yj>=1&&nex.yj<=M&&!map[nex.xj][nex.yj]&&!dis[nex.xj][nex.yj][nex.xm][nex.ym][nex.xp][nex.yp])
{
if(nex.xj==X&&nex.yj==Y)
{
return nex.step;
}
dis[nex.xj][nex.yj][nex.xm][nex.ym][nex.xp][nex.yp]=1;
Q.push(nex);
}
else
{
break;
}
nex.xj+=dir[i][0];
nex.yj+=dir[i][1];
}
}
for(int i=0;i<4;i++)
{
nex=fir;
nex.xp=fir.xp+dir[i][0];
nex.yp=fir.yp+dir[i][1];
nex.step=fir.step+1;
num=0;
while(1)
{
if(!(nex.xp>=1&&nex.xp<=N&&nex.yp>=1&&nex.yp<=M))break;
if(map[nex.xp][nex.yp])num++;
if(num>1)break;
if(nex.xp==X&&nex.yp==Y&&num==0)
break;
if(nex.xp==X&&nex.yp==Y&&num==1)
{
// printf("<%d,%d>\n",nex.xp,nex.yp);
return nex.step;
}
if(!map[nex.xp][nex.yp]&&!dis[nex.xj][nex.yj][nex.xm][nex.ym][nex.xp][nex.yp]&&num==0)
{
dis[nex.xj][nex.yj][nex.xm][nex.ym][nex.xp][nex.yp]=1;
Q.push(nex);
}
nex.xp+=dir[i][0];
nex.yp+=dir[i][1];
}
}
map[fir.xj][fir.yj]=0;
map[fir.xm][fir.ym]=0;
map[fir.xp][fir.yp]=0;
}
return -1;
}
int main()
{
char c[21][21];
int l=0;
while(~scanf("%d%d",&N,&M))
{
memset(dis,0,sizeof(dis));
for(int i=1;i<=N;i++)
scanf("%s",c[i]+1);
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++)
{
//cin>>c;
if(c[i][j]==‘D‘)
{
map[i][j]=1;
}
else
{
map[i][j]=0;
}
if(c[i][j]==‘S‘)
{
X=i,Y=j;
continue;
}
if(c[i][j]==‘C‘)
{
ax=i,ay=j;
continue;
}
if(c[i][j]==‘M‘)
{
bx=i,by=j;
continue;
}
if(c[i][j]==‘P‘)
{
cx=i,cy=j;
}
}
int time=bfs();
l++;
printf("Scenario #%d\n",l);
if(time==-1)
{
printf("OH!That‘s impossible!\n\n");
}
else
printf("%d\n\n",time);
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/letterwuyu/article/details/42714135