紫书(第四章,函数与递归)

吃透这本书?吃透这本书。

结构体的两种定义方式

typedef struct{
    int x,y;
}node;
struct node{
    int x,y;
};

组合数的求法有:暴力、杨辉三角、柯西定理、分解质因数。详情请见我的另一篇博客https://blog.csdn.net/qq_41635132/article/details/81713031
素数判定 有普通判定,普通筛,欧拉筛,杜教筛等等,详见我的博客,
https://blog.csdn.net/qq_41635132/article/details/82423386

知识有点多,不破不立,既然向往明天,何在乎荆棘!

指针 不要幻想我在这里讲清楚,我就不,哼!(其实是我不会,,)
比较灵活的void*,可以转换称其他指针,真的强
比如malloc这个函数(int *)malloc(sizeof(int)),就是用到了这个知识点。

例题


UVa 1339(Ancient Cipher)
思维题,只是一个排序而已,排序这个课题先留着这一张学完了就搞排序

#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int lena,lenb;
int a[26],b[26];
int main(){
    while(cin>>s1>>s2){
        lena=s1.length(),lenb=s2.length();
        if(lena!=lenb)puts("NO");
        else{
            memset(a,0,sizeof a),memset(b,0,sizeof b);
            for(int i=0;i<lena;i++)a[s1[i]-'A']++,b[s2[i]-'A']++;
            sort(a,a+26);sort(b,b+26);
            bool flag=true;
            for(int i=0;i<26;i++){
                if(a[i]!=b[i]){flag=false;break;}
            }
            if(flag)puts("YES");
            else puts("NO");
        }
    }
    return 0;
}

UVa 489 (Hangman Judge)
https://vjudge.net/problem/UVA-489
做一个映射就好了。

#include<bits/stdc++.h>
using namespace std;
int a[26],len,num,t;
char s[100];
int main(){
    int T;
    for(scanf("%d",&T);~T;scanf("%d",&T)){
        printf("Round %d\n",T);
        memset(a,0,sizeof a),num=t=0;
        scanf("%s",s),len=strlen(s);
        for(int i=0;i<len;i++)num+=!a[s[i]-'a'],a[s[i]-'a']=1;
        scanf("%s",s),len=strlen(s);
        for(int i=0;i<len;i++){
            if(!~a[s[i]-'a'])continue;
            else if(!a[s[i]-'a'])a[s[i]-'a']=-1,t++;
            else a[s[i]-'a']=-1,num--;
            if(t>=7){puts("You lose.");break;}
            if(!num){puts("You win.");break;}
        }
        if(num&&t<7)puts("You chickened out.");
    }
    return 0;
}

UVa 133 (The Dole Queue)
https://vjudge.net/problem/UVA-133

#include<bits/stdc++.h>
using namespace std;
bool in[25];
int n,m,k,L;
int go(int s,int p,int step){
    while(step--)do{s=(s+p+n-1)%n+1;}while(!in[s]);
    return s;
}
int main(){
    while(~scanf("%d%d%d",&n,&k,&m)&&(n||k||m)){
        memset(in,true,sizeof in),L=n;
        int p1=n,p2=1;
        while(L){
            p1=go(p1,1,k),p2=go(p2,-1,m);
            if(p1==p2)printf("%3d",p1),L--;
            else printf("%3d%3d",p1,p2),L-=2;
            in[p1]=in[p2]=false;
            if(L)printf(",");
        }
        puts("");
    }
    return 0;
}

UVa 213 (Message Decoding)
https://vjudge.net/problem/UVA-213
这道题看博客了,scanf(“%1d”,&x);学到了

#include<bits/stdc++.h>
using namespace std;
const int N=1000;
char s[N],key[8][1<<8],c;
int val,len,l;
void read(){
    len=1;
    l=strlen(s);
    for(int i=val=0;i<l;i++)
        if(val<((1<<len)-1))key[len][val++]=s[i];
        else{
            val=0;
            key[++len][val++]=s[i];
        }
}
void print(){
    for(int i=val=0;i<len;i++){
        do scanf("%c",&c);while(!isdigit(c));
        val=val*2+(c-'0');
    }
    if(val>=((1<<len)-1))return;
    else{
        printf("%c",key[len][val]);
        print();
    }
}
int main(){
    int l1,l2,l3;
    while(gets(s)!=NULL){
        if(!s[0])continue;
        memset(key,0,sizeof key);
        read();
        while(scanf("%1d%1d%1d",&l1,&l2,&l3),len=4*l1+2*l2+l3)print();
        puts("");
    }
    return 0;
}

UVa 512 (Spreadsheet Tracking)
https://vjudge.net/problem/UVA-512
50*50,随便模拟啊,怎么暴力都不会超时

#include<bits/stdc++.h>
using namespace std;
pair<int,int>MAP[55][55];
int l,c;
bool cmp(int a,int b){return a>b;}
void EX(){
    int x1,y1,x2,y_2;
    scanf("%d%d%d%d",&x1,&y1,&x2,&y_2);
    swap(MAP[x1][y1],MAP[x2][y_2]);
}
void DC(){
    int n;scanf("%d",&n);
    int a[n];
    for(int i=0;i<n;i++)scanf("%d",&a[i]);
    sort(a,a+n,cmp);
    for(int i=0;i<n;i++){
        int x=a[i];
        for(int i=1;i<=l;i++)
            for(int j=x+1;j<=c;j++)
                MAP[i][j-1]=MAP[i][j];
        c--;
    }
}
void DR(){
    int n;scanf("%d",&n);
    int a[n];
    for(int i=0;i<n;i++)scanf("%d",&a[i]);
    sort(a,a+n,cmp);
    for(int i=0;i<n;i++){
        int x=a[i];
        for(int i=x+1;i<=l;i++)
            for(int j=1;j<=c;j++)
                MAP[i-1][j]=MAP[i][j];
        l--;
    }
}
void IC(){
    int n;scanf("%d",&n);
    int a[n];
    for(int i=0;i<n;i++)scanf("%d",&a[i]);
    sort(a,a+n,cmp);
    for(int i=0;i<n;i++){
        int x=a[i];
        for(int i=1;i<=l;i++)
            for(int j=c;j>=x;j--)
                MAP[i][j+1]=MAP[i][j];
        for(int i=1;i<=l;i++)MAP[i][x]={0,0};
        c++;
    }
}
void IR(){
    int n;scanf("%d",&n);
    int a[n];
    for(int i=0;i<n;i++)scanf("%d",&a[i]);
    sort(a,a+n,cmp);
    for(int i=0;i<n;i++){
        int x=a[i];
        for(int i=l;i>=x;i--)
            for(int j=1;j<=c;j++)
                MAP[i+1][j]=MAP[i][j];
        for(int i=0;i<=c;i++)MAP[x][i]={0,0};
        l++;
    }
}
pair<int,int>find(pair<int,int>v){
    for(int i=1;i<=l;i++)
        for(int j=1;j<=c;j++)
            if(MAP[i][j]==v)return {i,j};
    return {0,0};
}
void print(){
    for(int i=1;i<=l;i++){
        for(int j=1;j<=c;j++){
            cout<<"("<<MAP[i][j].first<<","<<MAP[i][j].second<<") ";
        }
        cout<<endl;
    }
}
char command[5];
int main(){
    int T=0;
    while(~scanf("%d%d",&l,&c)&&(l||c)){
        if(T)puts("");
        for(int i=1;i<=l;i++)
            for(int j=1;j<=c;j++)
                MAP[i][j]={i,j};
        int n;scanf("%d",&n);
        while(n--){
            scanf("%s",command);
            if(command[0]=='E')EX();
            else if(command[0]=='I'&&command[1]=='C')IC();
            else if(command[0]=='I'&&command[1]=='R')IR();
            else if(command[0]=='D'&&command[1]=='C')DC();
            else if(command[0]=='D'&&command[1]=='R')DR();
        }
        printf("Spreadsheet #%d\n",++T);
        scanf("%d",&n);
        while(n--){
            int a,b;scanf("%d%d",&a,&b);
            pair<int,int>k=find({a,b});
            if(k.first)printf("Cell data in (%d,%d) moved to (%d,%d)\n",a,b,k.first,k.second);
            else printf("Cell data in (%d,%d) GONE\n",a,b);
        }
    }
    return 0;
}

UVa 1589 (Xiangqi)
https://vjudge.net/problem/UVA-1589
啊啊啊啊啊,到底有什么BUG,对于象棋九段的我,竟然过不了,过几天再看看。

#include<bits/stdc++.h>
using namespace std;
char MAP[12][12],c;
int n,x,y,a,b;
int dir[8][2]={2,1,2,-1,-2,1,-2,-1,1,2,1,-2,-1,2,-1,-2};
bool faker(){
    for(int i=x+1;i<=10;i++){
        if(MAP[i][y]=='G')return true;
        if(MAP[i][y]!=' ')return false;
    }
    return false;
}
bool killing(int xx,int yy){
    if(xx<0||xx>3||yy<4||yy>6)return false;
    for(int i=0;i<8;i++){
        int xxx=xx+dir[i][0],yyy=yy+dir[i][1];
        int xxxx=xx+dir[i][0]>0?1:-1,yyyy=yy+dir[i][1]>0?1:-1;
        if(xxx<1||MAP[xxxx][yyyy]!=' ')continue;
        if(MAP[xxx][yyy]=='H')return false;
    }
    for(int i=xx+1;i<=10;i++){
        if(MAP[i][yy]=='R'||MAP[i][yy]=='G')return false;
        else if(MAP[i][yy]!=' ')break;
    }
    for(int i=xx-1;i>=1;i--){
        if(MAP[i][yy]=='R')return false;
        else if(MAP[i][yy]!=' ')break;
    }
    for(int i=yy+1;i<=10;i++){
        if(MAP[xx][i]=='R')return false;
        else if(MAP[xx][i]!=' ')break;
    }
    for(int i=yy-1;i>=1;i--){
        if(MAP[xx][i]=='R')return false;
        else if(MAP[xx][i]!=' ')break;
    }
    bool flag=false;
    for(int i=xx+1;i<=10;i++){
        if(MAP[i][yy]=='C'&&flag)return false;
        else if(MAP[i][yy]!=' '&&!flag)flag=true;
        else if(MAP[i][yy]!=' ')break;
    }
    flag=false;
    for(int i=xx-1;i>=1;i--){
        if(MAP[i][yy]=='C'&&flag)return false;
        else if(MAP[i][yy]!=' '&&!flag)flag=true;
        else if(MAP[i][yy]!=' ')break;
    }
    flag=false;
    for(int i=yy+1;i<=10;i++){
        if(MAP[xx][i]=='C'&&flag)return false;
        else if(MAP[xx][i]!=' '&&!false)flag=true;
        else if(MAP[xx][i]!=' ')break;
    }
    flag=false;
    for(int i=yy-1;i>=1;i--){
        if(MAP[xx][i]=='C'&&flag)return false;
        else if(MAP[xx][i]!=' '&&!flag)flag=true;
        else if(MAP[xx][i]!=' ')break;
    }
    return true;
}
int main(){
    while(cin>>n>>x>>y&&(n||x||y)){
        memset(MAP,' ',sizeof MAP);
        while(n--){
            cin>>c>>a>>b;
            MAP[a][b]=c;
        }
        if(faker())puts("NO");
        else{
            if(killing(x-1,y)||killing(x+1,y)||killing(x,y-1)||killing(x,y+1))puts("NO");
            else puts("YES");
        }
    }
    return 0;
}

UVa 201(Squares)
https://cn.vjudge.net/problem/UVA-201
还是无脑模拟而已,我这里建图了,因为这样思路比较清晰,其他的方法应该也行。

#include<bits/stdc++.h>
using namespace std;
bool MAP[12][12][2];
char c;
bool judge(int x,int y,bool type,int step){
    if(!step)return true;
    if(type){
        if(MAP[x][y][0])return judge(x,y+1,type,step-1);
        return false;
    }
    else{
        if(MAP[x][y][1])return judge(x+1,y,type,step-1);
        return false;
    }
}
int main(){
    int n,m,a,b,T=0;
    while(cin>>n>>m){
        if(T)cout<<endl<<"**********************************"<<endl<<endl;
        cout<<"Problem #"<<++T<<endl<<endl;
        memset(MAP,false,sizeof MAP);
        while(m--){
            cin>>c>>a>>b;
            if(c=='H')MAP[a][b][0]=true;
            else MAP[b][a][1]=true;
        }
        bool flag=false;
        for(int d=1;d<n;d++){
            int ans=0;
            for(int i=1;i<=n-d;i++){
                for(int j=1;j<=n-d;j++){
                    if(judge(i,j,true,d)&&judge(i,j,false,d)&&judge(i+d,j,true,d)&&judge(i,j+d,false,d))ans++;                }
            }
            if(ans){
                cout<<ans<<" square (s) of size "<<d<<endl;
                flag=true;
            }
        }
        if(!flag)cout<<"No completed squares can be found."<<endl;
    }
    return 0;
}

UVa 220(Othello)
https://cn.vjudge.net/problem/UVA-220
恶心,网上代码,,,

#include<bits/stdc++.h>
using namespace std;
char MAP[10][10];
int f[2][10][10];
int dx[]={-1,-1,-1, 1,1,1,0, 0};
int dy[]={-1, 0, 1,-1,0,1,1,-1};
void is(int a,char b,int x,int y){
    for(int k=0;k<8;k++){
        int tx=x+dx[k];
        int ty=y+dy[k];
        int num=0;
        while(tx>=0&&ty>=0&&tx<8&&ty<8&&MAP[tx][ty]==b){
            tx+=dx[k];
            ty+=dy[k];
            ++num;
        }
        if(num>=1&&MAP[tx][ty]=='-')f[a][tx][ty]|=1<<k;
    }
}
void init(){
    for(int i=0;i<8;i++)
        for(int j=0;j<8;j++)
            if(MAP[i][j]=='W')is(0,'B',i,j);
            else if(MAP[i][j]=='B')is(1,'W',i,j);
}
bool print(bool isprint,int p){
    bool flag=false;
    for(int i=0;i<8;i++)
        for(int j=0;j<8;j++)
            if(f[p][i][j]){
                if(flag&&isprint)cout<<" ";
                flag=true;
                if(isprint)cout<<'('<<i+1<<','<<j+1<<")";
                else return flag;
            }
    if(isprint){
        if(flag)cout<<endl;
        else cout<<"No legal move."<<endl;
    }
    return flag;
}
void move(int x,int y,int p){
    char ch;
    if(p==0)ch='W';
    else ch='B';
    MAP[x][y]=ch;
    for(int i=0;i<8;i++){
        if(f[p][x][y]&1<<i){
            int tx=x-dx[i];
            int ty=y-dy[i];
            while(tx>=0&&ty>=0&&tx<8&&ty<8&&MAP[tx][ty]!=ch){
                MAP[tx][ty]=ch;
                tx-=dx[i];
                ty-=dy[i];
            }
        }
    }
}
int main(){
    int T;cin>>T;
    while(T--){
        memset(MAP,0,sizeof MAP);
        for(int i=0;i<8;i++)cin>>MAP[i];
        char ch[5];int p;
        cin>>ch;
        if(ch[0]=='W')p=0;
        else p=1;
        while(ch[0]!='Q'){
            memset(f,0,sizeof f);
            init();
            cin>>ch;
            if(ch[0]=='L')print(true,p);
            else if(ch[0]=='M'){
                if(!print(false, p))p^=1;
                move(ch[1]-'0'-1,ch[2]-'0'-1, p);
                p^=1;
                int wnum=0;
                int bnum=0;
                for(int i=0;i<8;i++)
                    for(int j=0;j<8;j++){
                        if(MAP[i][j]=='W')++wnum;
                        if(MAP[i][j]=='B')++bnum;
                    }
                printf("Black - %2d White - %2d\n", bnum, wnum);
            }
        }
        for(int i=0;i<8;i++)cout<<MAP[i]<<endl;
        if(T!=0)cout<<endl;
    }
    return 0;
}

UVa 253(Cube painting)
https://cn.vjudge.net/problem/UVA-253
这样的模拟题才有意思嘛

#include<bits/stdc++.h>
using namespace std;
struct node{
    char k[6];
    void get(char *c){
        for(int i=0;i<6;i++)k[i]=c[i];
    }
    void swapL(){
        char temp=k[0];
        k[0]=k[1],k[1]=k[5],k[5]=k[4],k[4]=temp;
    }
    void swapC(){
        char temp=k[1];
        k[1]=k[3],k[3]=k[4],k[4]=k[2],k[2]=temp;
    }
    void swapX(){
        char temp=k[0];
        k[0]=k[3],k[3]=k[5],k[5]=k[2],k[2]=temp;
    }
}a[2];
bool judge(node A,node B){
    for(int i=0;i<6;i++){
        if(A.k[i]!=B.k[i])return false;
    }
    return true;
}
char c[20];
int main(){
    //freopen("D:\\out.txt","w",stdout);
    while(gets(c)!=NULL){
        a[0].get(c),a[1].get(c+6);
        bool flag=false;
        for(int i=0;i<4;i++){
            a[0].swapL();
            for(int j=0;j<4;j++){
                a[0].swapC();
                for(int k=0;k<4;k++){
                    a[0].swapX();
                    if(judge(a[0],a[1])){flag=true;break;}
                }
                if(flag)break;
            }
            if(flag)break;
        }
        if(flag)puts("TRUE");
        else puts("FALSE");
    }
    return 0;
}

UVa 1590(IP Networks)
https://cn.vjudge.net/problem/UVA-1590
模拟模拟模拟模拟,顺便了解下网络的知识。

#include<bits/stdc++.h>
using namespace std;
int a[9]={255,254,252,248,240,224,192,128,0};
int ip[4][1024],minip[4],hide[4];
int main(){
    int m;
    while(~scanf("%d",&m)){
        memset(ip,0,sizeof ip);
        for(int i=0;i<m;i++)scanf("%d.%d.%d.%d",&ip[0][i],&ip[1][i],&ip[2][i],&ip[3][i]);
        for(int i=0;i<4;i++){
            sort(ip[i],ip[i]+m);
            int MAX=ip[i][m-1],MIN=ip[i][0],dif=0;
            for(int j=1;j<=8;j++){
                if(MAX%2!=MIN%2)dif=j;
                MAX>>=1,MIN>>=1;
            }
            hide[i]=a[dif];
            minip[i]=ip[i][0]&hide[i];
        }
        for(int i=0;i<4;i++){
            if(hide[i]!=255){
                for(i=i+1;i<4;i++)hide[i]=minip[i]=0;
                break;
            }
        }
        printf("%d.%d.%d.%d\n",minip[0],minip[1],minip[2],minip[3]);
        printf("%d.%d.%d.%d\n",hide[0],hide[1],hide[2],hide[3]);
    }
    return 0;
}

UVa 12108(Extraodinarily Tried students)
https://vjudge.net/problem/UVA-12108
无脑模拟,感觉这一道题可以试一试线程的,有时间试一试。

#include<bits/stdc++.h>
using namespace std;
int Sleep,n;
struct node{
    int L,S,now;
    bool ok;
    void get(){
        cin>>L>>S>>now;
        while(now>L+S)now-=L+S;
        ok=(now<=L);
        if(!ok)Sleep++;
    }
    void add(){
        now++;
        if(now>L+S)now-=L+S,ok=true;
        else if(now==L+1&&Sleep<=(n-Sleep))now=1;
        else if(now==L+1)ok=false;
    }
}a[20];
void go(){
    int sum=0;
    for(int i=0;i<n;i++){
        a[i].add();
        if(!a[i].ok)sum++;
    }
    Sleep=sum;
}
int main(){
    int Case=0;
    while(cin>>n&&n){
        Sleep=0;
        for(int i=0;i<n;i++)a[i].get();
        bool flag=false;
        for(int i=1;i<10000;i++){
            if(Sleep==0){
                flag=true;
                cout<<"Case "<<++Case<<": "<<i<<endl;
                break;
            }
            go();
        }
        if(!flag)cout<<"Case "<<++Case<<": "<<-1<<endl;
    }
    return 0;
}

UVa 1591(Data Mining)
https://vjudge.net/problem/UVA-1591
智障题吧,那么简单题目那么长,,,

#include<bits/stdc++.h>
using namespace std;
int main(){
    long long n,x,y,N,ansN,ansA,ansB;
    while(cin>>n>>x>>y) {
        ansN=n*y<<10;
        for(int i=0;i<32;i++) {
            for(int j=0;j<32;j++) {
                N=(((n-1)*x+((n-1)*x<<i))>>j)+y;
                if(N>=n*y&&N<ansN)ansA=i,ansB=j,ansN=N;
            }
        }
        cout<<ansN<<" "<<ansA<<" "<<ansB<<endl;
    }
    return 0;
}

UVa 815(Flooded)
https://vjudge.net/problem/UVA-815
这道题排下序就好了,可能有疑问为啥不可能有多个水坑,可能题目描述了吧,紫书没说清楚。

#include<bits/stdc++.h>
using namespace std;
int MAP[1000];
int main(){
    int n,m,Case=0;
    double v;
    while(cin>>n>>m&&(n||m)){
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                cin>>MAP[i*m+j];
        cin>>v;
        int s=1;
        double kk;
        sort(MAP,MAP+n*m);
        while(true){
            if(s==n*m){
                kk=v/s/100+MAP[s-1];
                break;
            }
            v-=(MAP[s]-MAP[s-1])*s*100;
            if(v<=0){
                v+=(MAP[s]-MAP[s-1])*s*100;
                kk=v/s/100+MAP[s-1];
                break;
            }
            s++;
        }
        cout<<"Region "<<++Case<<endl;
        cout<<fixed<<setprecision(2)<<"Water level is "<<kk<<" meters."<<endl;
        cout<<s*1.0/m/n*100<<" percent of the region is under water."<<endl<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41635132/article/details/82421949