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

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

*/ 
#include<iostream>
#include<cstdio>
#include<string>
#include<cmath>
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<manx;i++) z[i]=0;
        x.clear();
        for(int i=0;i<n;i++){
            cin>>s;
            x += s[0];
        }
        for(int i=0;i<x.size();i++){
            for(int j=i-1;j>=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<<z[x.size()-1]<<endl;
    }
}

/*

4
shaoshan
erzhong
shangxia
dongmen

5
shaoshan
shangxia
ertian
erzhong
dongmen

*/

/*

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

*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
#define manx 600000
int flag,mark;
bool s[manx];

struct node{
    int ans;
    int temp;
};

queue<node>que;

void init(){
    while(!que.empty()) que.pop();
    for(int i=0;i<manx;i++) s[i]=0;
}

void bfs(int xx,int yy){
    node te = que.front();
    s[te.ans]=1;
    while(!que.empty()){
        te=que.front();
        que.pop();
     //   cout<<te.ans<<endl;
      //  system("pause");
        if(te.ans==mark){ flag=1; cout<<te.temp<<endl; break; }
        int x[2][3];
        x[0][0]=te.ans/100000%10;
        x[0][1]=(te.ans/10000)%10;
        x[0][2]=(te.ans/1000)%10;
        x[1][0]=(te.ans/100)%10;
        x[1][1]=(te.ans/10)%10;
        x[1][2]=te.ans%10;
        for(int i=0;i<2;i++){
            for(int j=0;j<3;j++)
                if(x[i][j]==0) xx=i,yy=j;
        }
        
        if(xx+1<2){
            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(xx-1>=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!"<<endl;
    } 
  //  while(1);
}

/*

2
0 1 2
3 4 5
1 2 0
3 4 5

1 2 0
4 5 3
1 2 3
4 0 5

*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值