2017年华中科技大学上机详解

来源:互联网 发布:网线 知乎 编辑:程序博客网 时间:2024/04/28 19:32

problem1:输出N个字符串的最长公共子串

                   这个题目只可以暴力做了。

#include <bits/stdc++.h>using namespace std;int main(){    int N;    string s[25];    freopen("in.txt","r",stdin);    while (scanf("%d",&N)==1){        getchar();        for (int i=0;i<N;i++)            getline(cin,s[i]);        for (int i=0;i<N;i++) cout<<s[i]<<endl;        int len = s[0].length();        string ans;        for (int i=0;i<len;i++)        {            for (int j=i;j<len;j++)            {                string sub = s[0].substr(i,j);                for (int k=1;k<N;k++)                {                    int tlen = s[k].length();                    for (int ii=0;ii<tlen;ii++)                    {                        for (int jj=ii;jj<tlen;jj++)                        {                            string ssub = s[k].substr(ii,jj);                            //cout<<"check "<<sub<<" "<<ssub<<endl;                            if (sub==ssub&&ssub.length()>ans.length()){                                cout<<"match "<<ssub<<endl;                                ans=ssub;                                cout<<ans<<endl;                            }                        }                    }                }            }        }        cout<<ans<<endl;    }    return 0;}

第二题:马遍历问题

#include <bits/stdc++.h>using namespace std;int cnt=0;int vis[5][5];int dx[]={1,2,2,1,-1,-2,-2,-1};int dy[]={2,1,-1,-2,-2,-1,1,2};int isok(int x,int y){    if (x<0||x>4||y<0||y>4) return 0;    else return 1;}void dfs(int x,int y){    if (x==4&&y==4) cnt++;    if (x>=5) return ;    if (y>=5) return ;    //if (vis[x][y]) return ;    for (int i=0;i<8;i++)    {        int tx = x+dx[i];        int ty = y+dy[i];        if (vis[tx][ty]==0&&isok(tx,ty))        {            vis[tx][ty]=1;            dfs(tx,ty);            vis[tx][ty]=0;        }    }}int main(){    memset(vis,0,sizeof(vis));    vis[0][0]=1;    dfs(0,0);    printf("%d\n",cnt);    return 0;}


0 0
原创粉丝点击