4 22
1
爆搜。。基础剪枝即可。
#include <iostream> #include <cstdio> #include <algorithm> #include <queue> #include <cctype> #include <cstring> using namespace std; int ma[18][18],m,n,ans; bool vis[18][18]; const int INF=0x3f3f3f3f; int dir[2][2]={{1,0},{0,1}}; void dfs(int x,int y,bool statu,int num,int sum) { //最优剪 if(num>ans) return ; //可行剪 if(sum>n) return ; if(x==m&&y==m) { if(sum==n) ans=min(ans,num); return ; } for(int i=0;i<2;i++) { int tx=x+dir[i][0]; int ty=y+dir[i][1]; if(tx>=1&&tx<=m&&ty>=1&&ty<=m&&!vis[tx][ty]) { vis[tx][ty]=1; if(sum==1) dfs(tx,ty,i,num,sum+ma[tx][ty]); else { if(i!=statu) dfs(tx,ty,i,num+1,sum+ma[tx][ty]); else dfs(tx,ty,i,num,sum+ma[tx][ty]); } vis[tx][ty]=0; } } } void init() { for(int i=1;i<=m;i++) for(int j=1;j<=m;j++) ma[i][j]=i; } int main() { while(scanf("%d%d",&m,&n)!=EOF) { memset(vis,0,sizeof(vis)); init(); vis[1][1]=1; ans=INF; dfs(1,1,0,0,1); printf("%d\n",ans); } return 0; }
原文地址:http://blog.csdn.net/qq_16255321/article/details/40323781