10.16

来源:互联网 发布:互联网大数据图片 编辑:程序博客网 时间:2024/06/15 10:31

匹配

题目描述是用来迷惑人的,距离是一个定值,并非有最小距离之和。

玩积木

数据保证十步以内有解,就是说可以暴力搜索,4的10次方不会超范围。

正解用了A*算法,其实就是暴力的基础上加一个判断,不可能合法的路径就直接返回,使程序不会超时间限制。

字符串

此题我用KMP暴力,其实和KMP类似,用的是AC自动机,它适用于多模匹配。此题还有一个技巧就是在母字符串中修改一个字符只会影响到修改的点的下标加减最大匹配字符串长度。

玩积木代码

# include <iostream># include <cstdio># include <cstring># include <queue># include <cmath># include <stack># include <algorithm>using namespace std;const int INF=1e9+7;const int Map[7][7]={0,0,0,0,0,0,0,                     0,0,0,0,0,0,0,                     0,1,1,0,0,0,0, 0,2,2,2,0,0,0, 0,3,3,3,3,0,0, 0,4,4,4,4,4,0, 0,5,5,5,5,5,5};const int fx[5]={0,-1,-1,1,1};const int fy[5]={0,-1,0,0,1};int n,m,t,ans,r,c,a[10][10];int judge(){int num=0;for(int i=1;i<=6;i++)for(int j=1;j<=i;j++)if(a[i][j]!=Map[i][j])num++;return num;}void dfs(int x,int y,int dep){if(dep>ans) return;if(judge()==0){ans=min(ans,dep);return ;}if(dep+judge()>ans)return ;for(int i=1;i<=4;i++){int ix=x+fx[i];int iy=y+fy[i];if(ix>=1&&ix<=6&&iy>=1&&iy<=ix&&a[ix][iy]){swap(a[x][y],a[ix][iy]);dfs(ix,iy,dep+1);swap(a[x][y],a[ix][iy]);}}}int main(){//freopen("k.in","r",stdin);//freopen("k.out","w",stdout);cin>>t;while(t--){ans=21;for(int i=1;i<=6;i++)for(int j=1;j<=i;j++){cin>>a[i][j];if(a[i][j]==0){r=i;c=j;}}dfs(r,c,0);if(ans<=20) cout<<ans<<endl;else cout<<"too difficult"<<endl;}}

原创粉丝点击