2013年湘潭大学程序设计比赛

/*
B题
类型:动态规划,思考由后往前,代码,由前往后。。。注意边界。。。 

*/ 
#include
#include
#include
#include
using namespace std;
#define manx 1009
string x;
int z[manx];

int main(){
    int n;
    while(cin>>n){
        char s[109];
        for(int i=0;i>s;
            x += s[0];
        }
        for(int i=0;i=0;j--){
                z[i]=max(z[i],z[j]);              
                if(x[i]==x[j] && j>=1) z[i]=max(z[i],z[j-1]+1); 
                if(x[i]==x[j] && j==0) z[i]=max(z[i],1);
            }
        }
        cout<

/*

G题 
类型:状态压缩搜索
思路,因为状态特殊,每一个状态都可以用一个数字来代替 

*/
#include
#include
#include
#include
#include
using namespace std;
#define manx 600000
int flag,mark;
bool s[manx];

struct node{
    int ans;
    int temp;
};

queueque;

void init(){
    while(!que.empty()) que.pop();
    for(int i=0;i=0){
            node qe=te;
            swap(x[xx][yy],x[xx-1][yy]);
            qe.temp++;
            int sum=0;            
            for(int i=0;i<2;i++){
                for(int j=0;j<3;j++){
                    sum=sum*10+x[i][j];
                }
            }
            qe.ans=sum;
            if(!s[sum]) { s[sum]=1; que.push(qe); }
            swap(x[xx][yy],x[xx-1][yy]);
        }
        if(yy+1<3){
            node qe=te;
            swap(x[xx][yy],x[xx][yy+1]);
            qe.temp++;
            int sum=0;            
            for(int i=0;i<2;i++){
                for(int j=0;j<3;j++){
                    sum=sum*10+x[i][j];
                }
            }
            qe.ans=sum;
            if(!s[sum]) { s[sum]=1; que.push(qe); }
            swap(x[xx][yy],x[xx][yy+1]);
        }
        if(yy-1>=0){
            node qe=te;
            swap(x[xx][yy],x[xx][yy-1]);
            qe.temp++;
            int sum=0;            
            for(int i=0;i<2;i++){
                for(int j=0;j<3;j++){
                    sum=sum*10+x[i][j];
                }
            }
            qe.ans=sum;
            if(!s[sum]) { s[sum]=1; que.push(qe); }
            swap(x[xx][yy],x[xx][yy-1]);
        }
    }
}

int main(){
    int t;
    cin>>t;
    while(t--){
        init();
        int a,sum=0;
        flag=0;
        node te;
        int st,ed,val;
        for(int i=0;i<2;i++){
            for(int j=0;j<3;j++){
                scanf("%d",&val);
                if(val==0) st=i,ed=j;
                sum=sum*10+val;
            }
        }
        te.ans=sum;
        sum=0;
        for(int i=0;i<2;i++){
            for(int j=0;j<3;j++){
                scanf("%d",&a);
                sum=sum*10+a; 
            }
        }
        mark=sum;
        te.temp=0;
        que.push(te);
        bfs(st,ed);
        if(!flag) cout<<"Impossible!"<

你可能感兴趣的:(杂题)