题解;
状压dp,枚举出来状态
枚举当前哪一个棋子移动
枚举怎么移动
代码:
#include<bits/stdc++.h> using namespace std; int f[1<<17],p,q,a[1<<17],dx[4]={1,-1,0,0},dy[4]={0,0,1,-1}; char s[17]; int dfs(int x) { if (x==q)return 0; if (f[x])return f[x]; f[x]=1e9; for (int i=0;i<4;i++) for (int j=0;j<4;j++) if ((x&(1<<(i*4+j)))==(1<<(i*4+j))) for (int k=0;k<4;k++) { int xx=i+dx[k],yy=j+dy[k]; if (xx>=0&&xx<4&&yy>=0&&yy<4 &&(x&(1<<(xx*4+yy)))!=(1<<(xx*4+yy))) f[x]=min(f[x],dfs((x^(1<<(i*4+j)))|(1<<(xx*4+yy)))+1); } return f[x]; } int main() { for (int i=0;i<4;i++) { scanf("%s",&s); for (int j=0;j<4;j++) if (s[j]=='1')p+=(1<<(i*4+j)); } for (int i=0;i<4;i++) { scanf("%s",&s); for (int j=0;j<4;j++) if (s[j]=='1')q+=(1<<(i*4+j)); } printf("%d",dfs(p)); }
注意:
f[x]在变化的时候,要在min里面加1
不然会wa