一道搜索题,,,,,,,一说是最短路题(每个位置都会有24种不同的正方体放置情况,,,求最短路,,)我用的模拟,,而且没用bfs用的dfs,,,,,,,先是预算出直接不拐弯到终点需要多少,,,,,然后深搜的时候大于的直接就舍弃了.....
忘了说题意,,,,,,,,就是一个正方体六个面有六个数,,,,,滚来滚去,,最底下的那个数加和,,问到终点和最小是多少........
#include <iostream>
#include <cstdio>
#include <bits/stdc++.h>
int near,far,top,right,bottom,left;
int qishi[3],zhongzhi[3];
int i,j,k,minn;
int w[10000]={0},b[10000];
int qw,ewq=1;
int flag;
int dfs(int heng, int shu,int xxx,int qw)
{
//printf("%d**\n",xxx);
if(ewq=0) return 0;
if(xxx>=minn) return 0;
if(heng<1||heng>8||shu<1||shu>8) return 0;
if(heng==zhongzhi[1]&&shu==zhongzhi[2])
{
//printf("%d\n",xxx);
if(minn>xxx) {minn=xxx; for(i=0;i<qw;i++) {b[i]=w[i]; b[qw]='\0';}
printf("%d",minn);
printf(" %c%d",qishi[2]-1+'a',qishi[1]);
for(i=0;i<qw;i++)
{
if(b[i]==1)
{
qishi[2]-=1;
}
else if(b[i]==2)
{
qishi[2]+=1;
}
else if(b[i]==3)
{
qishi[1]-=1;
}
else if(b[i]==4)
{
qishi[1]+=1;
}
printf(" %c%d",qishi[2]-1+'a',qishi[1]);
}
ewq=0;}
return 0;
}
if(heng>1&&flag!=2)
{
xxx+=near;
int t=near;
near=top;
top=far;
far=bottom;
bottom=t;
w[qw]=1;
int cx=flag;
flag=1;
dfs(heng-1,shu,xxx,qw+1);
xxx-=near;
t=near;
near=bottom;
bottom=far;
far=top;
top=t;
flag=cx;
}
if(heng<8&&flag!=1)
{ int cx=flag;
flag=2;
xxx+=far;
int t=near;
near=bottom;
bottom=far;
far=top;
top=t;
w[qw]=2;
dfs(heng+1,shu,xxx,qw+1);
xxx-=far;
t=near;
near=top;
top=far;
far=bottom;
bottom=t;
flag=cx;
}
if(shu>1&&flag!=4)
{
xxx+=right;
int t=right;
right=top;
top=left;
left=bottom;
bottom=t;
w[qw]=3;
int cx=flag;
flag=3;
dfs(heng,shu-1,xxx,qw+1); //printf("%d***\n",xxx);
xxx-=right;
t=right;
right=bottom;
bottom=left;
left=top;
top=t;
flag=cx;
}
if(shu<8&&flag!=3)
{ //printf("%d %d %d %d %d %d **(1)\n",near,far,top,right,bottom,left);
int cx=flag;
flag=4;
xxx+=left;
int t=left;
left=top;
top=right;
right=bottom;
bottom=t;
w[qw]=4;
dfs(heng,shu+1,xxx,qw+1);
qw--;
xxx-=left;
t=left;
left=bottom;
bottom=right;
right=top;
top=t;
flag=cx;
//printf("%d %d %d %d %d %d **(2)\n",near,far,top,right,bottom,left);
}
return 0;
}
int main()
{
char s1[3],s2[3];
scanf("%s %s",s1,s2);
qishi[1]=s1[1]-'0';
qishi[2]=s1[0]-'a'+1;
zhongzhi[1]=s2[1]-'0';
zhongzhi[2]=s2[0]-'a'+1;
scanf("%d %d %d %d %d %d",&near,&far,&top,&right,&bottom,&left);
minn=0;
qw=0;
flag=0;
//printf("%d***\n",abs(zhongzhi[1]-qishi[1]));
//printf("%d %d*\n",qishi[2],qishi[1]);
for(i=0;i<abs(zhongzhi[2]-qishi[2]);i++)
{
if(qishi[0]<zhongzhi[0])
{
minn+=abs(zhongzhi[2]-qishi[2])/4*(top+right+bottom+left);
if(abs(zhongzhi[2]-qishi[2])%4==1) minn+=right;
if(abs(zhongzhi[2]-qishi[2])%4==2) minn+=right+top;
if(abs(zhongzhi[2]-qishi[2])%4==3) minn+=right+top+left;
}
else if(qishi[2]>zhongzhi[2])
{
minn+=abs(zhongzhi[2]-qishi[2])/4*(top+right+bottom+left);
if(abs(zhongzhi[2]-qishi[2])%4==1) minn+=left;
if(abs(zhongzhi[2]-qishi[2])%4==2) minn+=left+top;
if(abs(zhongzhi[2]-qishi[2])%4==3) minn+=right+top+left;
}
}
for(i=0;i<abs(zhongzhi[1]-qishi[1]);i++)
{
if(qishi[1]>zhongzhi[1])
{
minn+=(abs(zhongzhi[1]-qishi[1])/4)*(top+near+bottom+far);
if(abs(zhongzhi[1]-qishi[1])%4==1) minn+=near;
if(abs(zhongzhi[1]-qishi[1])%4==2) minn+=near+top;
if(abs(zhongzhi[1]-qishi[1])%4==3) minn+=near+top+far;
}
else if(qishi[1]<zhongzhi[1])
{
minn+=abs(zhongzhi[1]-qishi[1])/4*(top+near+bottom+far);
if(abs(zhongzhi[1]-qishi[1])%4==1) minn+=far;
if(abs(zhongzhi[1]-qishi[1])%4==2) minn+=far+top;
if(abs(zhongzhi[1]-qishi[1])%4==3) minn+=far+top+near;
}
}
//printf("%d\n",minn);
dfs(qishi[1],qishi[2],0,0);
//printf("%d\n",minn);
//printf(" lujin");
return 0;
}
这题的思路特别简单,,,,,我写的也很傻瓜,,,,,,但是你没有看错,,,,,,我就是不知道哪里错了整出了死循环.................无奈了................
乖乖去看别人的代码.........
AC代码:
#include <iostream>
#include <cstdio>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll d6=1023,d5=d6<<10,d4=d5<<10,d3=d4<<10,d2=d3<<10,d1=d2<<10;
#define tl(x) ((x&d1)|(x&d2)|(x&d4)<<10|(x&d5)<<10|(x&d6)<<10|(x&d3)>>30)
#define tr(x) ((x&d1)|(x&d2)|(x&d6)<<30|(x&d3)>>10|(x&d4)>>10|(x&d5)>>10)
#define tu(x) ((x&d5)<<40|(x&d3)<<10|(x&d1)>>20|(x&d4)|(x&d2)>>30|(x&d6))
#define td(x) ((x&d3)<<20|(x&d5)<<30|(x&d2)>>10|(x&d4)|(x&d1)>>40|(x&d6))
map<ll,int>mm;
struct Nod
{
int x,y,d;
ll s;
Nod() {}
Nod(int x,int y,int d,ll s):x(x),y(y),d(d),s(s) {}
bool operator < (const Nod &p)const{return d>p.d;}
};
int d[10][10][30];
bool vis[10][10][30];
Nod pre[10][10][30];
int dx[]= {0,-1,0,1};
int dy[]= {-1,0,1,0}; //d l u r
int dij(int sx,int sy,ll ss,int tx,int ty,ll &ts)
{
priority_queue<Nod>q;
d[sx][sy][mm[ss]]=(ss&d5)>>10;
q.push(Nod(sx,sy,(ss&d5)>>10,ss));
int ux,uy,ud,vx,vy,vd;
ll us,vs;
while(!q.empty())
{
ux=q.top().x;uy=q.top().y;
ud=q.top().d;us=q.top().s;
q.pop();
if(ux==tx&&uy==ty){ts=us;return ud;}
if(vis[ux][uy][mm[us]]) continue;
vis[ux][uy][mm[us]]=1;
for(int i=0; i<4; i++)
{
vx=ux+dx[i];vy=uy+dy[i];
if(vx<1||vx>8||vy<1||vy>8) continue;
if(i==0) vs=td(us);
if(i==1) vs=tl(us);
if(i==2) vs=tu(us);
if(i==3) vs=tr(us);
vd=ud+((vs&d5)>>10);
if(vd<d[vx][vy][mm[vs]])
{
d[vx][vy][mm[vs]]=vd;
q.push(Nod(vx,vy,vd,vs));
pre[vx][vy][mm[vs]]=Nod(ux,uy,mm[us],0);
}
}
}
}
void path(Nod p)//print path
{
if(p.x==-1) return;
path(pre[p.x][p.y][p.d]);
printf(" %c%c",p.x+96,p.y+48);
}
int main()
{
memset(d,63,sizeof(d));
memset(vis,0,sizeof(vis));
memset(pre,-1,sizeof(pre));
char a,b,c,f;
ll e[6];
cin>>a>>b>>c>>f;
a-=96,b-=48,c-=96,f-=48;
for(int i=0; i<6; i++) cin>>e[i];
ll st,x=e[0]<<50|e[1]<<40|e[2]<<30|e[3]<<20|e[4]<<10|e[5],xx=x;
int i,j,k,cnt=0;
for(i=0; i<4; i++,xx=tl(xx))
for(j=0; j<4; j++,xx=tu(xx))
for(k=0; k<4; k++,xx=tl(xx))
if(mm.find(xx)==mm.end()) mm[xx]=cnt++;//find all states
cout<<dij(a,b,x,c,f,st);
path(Nod(c,f,mm[st],0));
return 0;
}
位运算加速了,,,,,,但是比较烦,,,,,还是就那四种动弹方式..........恩.............回去再多看看把,,,你还差的多呢!