紫书第四章 函数和递归

古老的密码(uva1339)

在这里插入图片描述
在这里插入图片描述

#include <bits/stdc++.h>
#define LOCAL
using namespace std;

int main()
{
    char s1[110];
    char s2[110];
    int c1[150],c2[150];

    #ifdef LOCAL
    freopen("data.in","r",stdin);
    #endif // LOCAL

    while(cin >> s1 >> s2)
    {
        memset(c1,0,sizeof(c1));
        memset(c2,0,sizeof(c2));
        int len = strlen(s1);
        for(int i = 0; i < len; i++)
        {
            c1[s1[i]]++;
            c2[s2[i]]++;
        }
        sort(c1,c1+150);
        sort(c2,c2+150);

        int ok = 1;
        for(int i = 0; i < 150; ++i)
            if(c1[i] != c2[i])
        {
            ok = 0;
            break;
        }

        if(ok)
            printf("YES\n");
        else
            printf("NO\n");
    }

    return 0;
}

刽子手游戏(uva489)

在这里插入图片描述
在这里插入图片描述
题目有句Each unique wrong guess only counts against the contestant once. 每个错误只会带来一次影响,但实际提交并不需要考虑,虽然考虑也能ac,而且之前正确的答案反复出现没有这个限制,都会算作一次错误

考虑该情况的代码

#include <bits/stdc++.h>
#define LOCAL
//注意每个字符错误只能记一次,但曾经正确的答案反复猜也是错
using namespace std;

const int maxn = 100;

int main()
{
    int rd;
    char s[maxn],g[maxn];
    int flag[150];
    int w[150];

    #ifdef LOCAL
    freopen("data.in","r",stdin);
    #endif // LOCAL

    while(scanf("%d",&rd) && rd != -1)
    {
        scanf("%s%s",s,g);
        int len1 = strlen(s);
        int len2 = strlen(g);
        memset(flag,0,sizeof(flag));
        memset(w,0,sizeof(w));

        int c = 0;
        for(int i = 0; i < len1; i++)
        {
            if(!flag[s[i]])
            {
                c++;
                flag[s[i]] = 1;
            }
        }

        int wrong = 0;
        for(int i = 0; i < len2; i++)
        {
            if(flag[g[i]] == 1)
            {
                c--;
                flag[g[i]] = 2;
            }
            else if(!w[g[i]])
            {
                wrong++;
                if(flag[g[i]] != 2)
                    w[g[i]] = 1;
            }

            if(c == 0 || wrong == 7)
                break;
        }

        printf("Round %d\n",rd);
        if(wrong == 7)
            printf("You lose.\n");
        else if(c == 0)
            printf("You win.\n");
        else
            printf("You chickened out.\n");
    }

    return 0;
}

书里原来的代码不需要考虑该情况也能ac

#include <bits/stdc++.h>
#define LOCA
const int maxn = 100;
using namespace std;

char s[maxn],s2[maxn];
int le = 0,chance = 0;
int win,lose;


void guess(char ch)
{
    int bad = 1;
    for(int i = 0; i < strlen(s); ++i)
        if(s[i] == ch)
    {
        bad = 0;
        s[i] = ' ';
        le--;
    }

    if(bad)
        chance--;
    if(!le)
        win = 1;
    else if(!chance)
        lose = 1;
}

int main()
{
    int rd;

    #ifdef LOCAL
    freopen("data.in","r",stdin);
    #endif // LOCAL

    while(scanf("%d",&rd) && rd != -1)
    {
        scanf("%s%s",s,s2);
        printf("Round %d\n",rd);
        win = lose = 0;
        le = strlen(s);
        chance = 7;
        int len  = strlen(s2);
        for(int i = 0; i < len; ++i)
        {
            guess(s2[i]);
            if(win || lose)
                break;
        }

        if(win)
            printf("You win.\n");
        else if(lose)
            printf("You lose.\n");
        else
            printf("You chickened out.\n");
    }

    return 0;
}

救济金发放(uva133)

在这里插入图片描述

#include <bits/stdc++.h>

using namespace std;

int n,k,m,a[30];

//m代表顺逆时针 p代表当前位置 s代表走几步
int go(int m,int p,int s)
{
    while(s--)
    {
        do
        {
            p = (p+m+n-1)%n+1;
        }while(a[p] == 0);
    }

    return p;
}

int main()
{
    while(scanf("%d%d%d",&n,&k,&m) && n)
    {
        int cnt = n;
        int p1 = n, p2 = 1;
        for(int i = 1; i <= n; i++)
            a[i] = 1;

        while(cnt)
        {
            p1 = go(1,p1,k);
            p2 = go(-1,p2,m);
            cnt--;
            printf("%3d",p1);
            if(p1 != p2)
                {
                    cnt--;
                    printf("%3d",p2);
                }
            a[p1] = a[p2] = 0;
            if(cnt)
                printf(",");
        }
        printf("\n");
    }

    return 0;
}

信息解码(uva213)

在这里插入图片描述
在这里插入图片描述

#include <bits/stdc++.h>
#define LOCAL
using namespace std;

char code[8][1<<8];

char readchar()
{
   int ch;
    while((ch = getchar()) == '\n' || ch == '\r');
    return ch;
}

int readcode()
{
    memset(code,0,sizeof(code));
    code[1][0] = readchar();  //因为第二个样例后会有回车需要readchar

    if(code[1][0] == EOF)
        return 0;

    int ch;
    for(int i = 2; i <= 7; i++)
        for(int j = 0; j < (1<<i)-1; j++)
    {
        ch = getchar();
        if(ch == EOF)
            return 0;
        if(ch == '\n' || ch == '\r')
            return 1;
        code[i][j] = ch;
    }

    return 1;
}

int readint(int len)
{
    int v = 0;
    while(len--)
    {
        v = v*2+( readchar()-'0' );
    }
    return v;
}


int main()
{
    #ifdef LOCAL
    freopen("data.in","r",stdin);
    #endif // LOCAL

   while(readcode())
   {
       int cnt = 0;
       for(;;)
       {
           int len = readint(3);
           if(len == 0)
            break;
           for(;;)
           {
               int t = readint(len);
               if(t == (1 << len)-1)
                break;
               putchar(code[len][t]);
           }
       }
       putchar('\n');
   }

   return 0;
}

追踪电子表格中的单元格

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
解法1

#include <bits/stdc++.h>
#define LOCAL
const int maxn = 100,BIG = 10000;
int r,c,d[maxn][maxn],ans[maxn][maxn],d2[maxn][maxn],cols[maxn];

using namespace std;

void Copy(char type,int q,int p)
{
    if(type == 'R'){
        for(int i = 1; i <= c; i++){
            d[p][i] = d2[q][i];
        }
    }
    else if(type == 'C'){
        for(int i = 1; i <= r; i++){
            d[i][p] = d2[i][q];
        }
    }
}

void Del(char type)
{
    int cnt = type=='R'?r:c;
    int cnt2 = 0;
    memcpy(d2,d,sizeof(d));
    for(int i = 1; i <= cnt; i++)
            if(!cols[i])
            Copy(type,i,++cnt2);
    if(type == 'R'){
        r = cnt2;
    }
    else if(type == 'C'){
        c = cnt2;
    }

}

void Ins(char type)
{
    int cnt = type=='R'?r:c;
    int cnt2 = 0;
    memcpy(d2,d,sizeof(d));

    for(int i = 1; i <= cnt; i++)
    {
        if(cols[i])
            Copy(type,0,++cnt2);
        Copy(type,i,++cnt2);
    }

    if(type == 'R')
        r = cnt2;
    else
        c = cnt2;
}

int main()
{
    #ifdef LOCAL
    freopen("data.in","r",stdin);
    #endif // LOCAL

    int n;
    int kase = 0;
    int ar,ac,br,bc;
    char cmd[12];
    while(scanf("%d%d",&r,&c) && r)
    {
        scanf("%d",&n);
        memset(d,0,sizeof(d));
        for(int i = 1; i <= r; i++)
            for(int j = 1; j <= c; j++)
            d[i][j] = i*BIG+j;

        for(int i = 0; i < n; i++)
        {
            scanf("%s",cmd);
            if(cmd[0] == 'E'){
                scanf("%d%d%d%d",&br,&bc,&ar,&ac);
                int t = d[br][bc];
                d[br][bc] = d[ar][ac];
                d[ar][ac] = t;
            }
            else
            {
                int nn,x;
                scanf("%d",&nn);
                memset(cols,0,sizeof(cols));
                for(int j = 0; j < nn; j++){
                    scanf("%d",&x);
                    cols[x] = 1;
                }
                if(cmd[0] == 'D')
                        Del(cmd[1]);
                else
                    Ins(cmd[1]);
            }
        }
        memset(ans,0,sizeof(ans));
        for(int i = 1; i <= r; i++)
            for(int j = 1; j <= c; j++)
           {
               ans[d[i][j]/BIG][d[i][j]%BIG] = i*BIG+j;
           }

        int na,xx,yy;
        scanf("%d",&na);
        if(kase != 0)
            putchar('\n');
        printf("Spreadsheet #%d\n",++kase);
        for(int i = 0; i < na; i++)
        {
            scanf("%d%d",&xx,&yy);
            printf("Cell data in (%d,%d) ",xx,yy);
            if(ans[xx][yy])
            printf("moved to (%d,%d)\n",ans[xx][yy]/BIG,ans[xx][yy]%BIG);
            else
                printf("GONE\n");
        }
    }

    return 0;
}

解法2

#include <bits/stdc++.h>
#define LOCAL
const int maxn = 100;
using namespace std;

typedef struct cmd{
    char cm[5];
    int r1,c1,r2,c2;
    int a,x[12];
}Cmd;

int r,c,n;
Cmd cmd[maxn];


int simulate(int &r0,int &c0)
{
    for(int i = 0; i < n; i++)
    {
        if(cmd[i].cm[0] == 'E')
        {
            if(r0 == cmd[i].r1 && c0 == cmd[i].c1)
                {r0 = cmd[i].r2;c0 = cmd[i].c2;}
            else if(r0 == cmd[i].r2 && c0 == cmd[i].c2)
                {r0 = cmd[i].r1;c0 = cmd[i].c1;}
        }
        else
        {
            int dr,dc;
            dr = dc = 0;
            for(int j = 0; j < cmd[i].a; j++)
            {
                int x = cmd[i].x[j];
                if(cmd[i].cm[0] == 'I')
                {
                    if(cmd[i].cm[1] == 'R' && r0 >= x)
                        dr++;
                    else if(cmd[i].cm[1] == 'C' && c0 >= x)
                        dc++;
                }
                else if(cmd[i].cm[0] == 'D')
                {
                    if(cmd[i].cm[1] == 'R' && x == r0) return 0;
                    else if(cmd[i].cm[1] == 'C' && x == c0) return 0;
                    else if(cmd[i].cm[1] == 'R' && r0 > x) dr--;
                    else if(cmd[i].cm[1] == 'C' && c0 > x) dc--;
                }
            }
            r0 += dr;
            c0 += dc;
        }
    }

    return 1;
}


int main()
{
     #ifdef LOCAL
    freopen("data.in","r",stdin);
    #endif // LOCAL
    int kase = 0;
    while(scanf("%d%d",&r,&c) && r)
    {
        scanf("%d",&n);
        for(int i = 0; i < n; i++)
        {
            scanf("%s",cmd[i].cm);
            if(cmd[i].cm[0] == 'E')
                scanf("%d%d%d%d",&cmd[i].r1,&cmd[i].c1,&cmd[i].r2,&cmd[i].c2);
            else
            {
                scanf("%d",&cmd[i].a);
                for(int j = 0; j < cmd[i].a; j++)
                    scanf("%d",&cmd[i].x[j]);
            }
        }

        int nn,r0,c0;
        scanf("%d",&nn);

        if(kase != 0)
            putchar('\n');
        printf("Spreadsheet #%d\n",++kase);

        for(int i = 0; i <  nn; i++)
        {
            scanf("%d%d",&r0,&c0);
            printf("Cell data in (%d,%d) ",r0,c0);
            if(!simulate(r0,c0))
                printf("GONE\n");
            else
                printf("moved to (%d,%d)\n",r0,c0);
        }

    }

    return 0;
}

师兄帮帮忙(uva12412)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <bits/stdc++.h>
#define LOCAL
#define maxn 1000
#define maxl 100
#define EPS 1e-6

int n = 0;
char sid[maxn][maxl];
int cid[maxn];
char name[maxn][maxl];
int score[maxn][5]; //第五个记录总分
int removed[maxn] = {0};

using namespace std;

int menu()
{
   int choice;
    printf("Welcome to Student Performance Management System (SPMS).\n");
    printf("\n");
    printf("1 - Add\n");
    printf("2 - Remove\n");
    printf("3 - Query\n");
    printf("4 - Show ranking\n");
    printf("5 - Show Statistics\n");
    printf("0 - Exit\n");
    printf("\n");

    scanf("%d",&choice);

    return choice;
}

bool finded()
{
    for(int i = 0; i < n; i++)
        if(!removed[i] && strcmp(sid[i],sid[n]) == 0 )
            return true;
    return false;
}

void add()
{
    for(;;)
    {
        printf("Please enter the SID, CID, name and four scores. Enter 0 to finish.\n");
        scanf("%s",sid[n]);
        if(strcmp(sid[n],"0") == 0)
            break;
        scanf("%d%s%d%d%d%d",&cid[n],name[n],&score[n][0],&score[n][1],&score[n][2],&score[n][3]);
        if(!finded())
        {
            score[n][4] = score[n][0]+score[n][1]+score[n][2]+score[n][3];
            n++;
        }
        else
            printf("Duplicated SID.\n");
    }
}

int ranks(int index)
{
    int r = 1;
    for(int i = 0; i < n; i++)
      if(!removed[i] && score[i][4] > score[index][4])
        r++;
    return r;
}

void DQ(int isq)
{
    char s[maxl];
    for(;;)
    {
        int r = 0;
         printf("Please enter SID or name. Enter 0 to finish.\n");
         scanf("%s",s);
         if(strcmp(s,"0") == 0)
            break;
         for(int i = 0; i < n; i++) if(!removed[i])
         {
             if(strcmp(s,sid[i]) == 0 || strcmp(s,name[i]) == 0){
                if(isq){
                    printf("%d %s %d %s %d %d %d %d %d %.2f\n",ranks(i),sid[i],cid[i],name[i],score[i][0],score[i][1],score[i][2],
                           score[i][3],score[i][4],(double)score[i][4]/4+EPS);
                }
                else
                {
                    removed[i] = 1;
                    r++;
                }
             }
         }
         if(!isq)
            printf("%d student(s) removed.\n",r);
    }
}

const char course[][18] = {"Chinese","Mathematics","English","Programming"};

int cnt[5];  //全过、过3、过2、过1、全没

void analyize(int c)
{
    memset(cnt,0,sizeof(cnt));

    for(int i = 0; i < n; i++)
        if(!removed[i] && (cid[i] == c || c == 0))
    {
        int flag = 0;
        for(int j = 0; j < 4; j++)
            if(score[i][j] >= 60)
            flag++;
        if(flag == 4)
            cnt[0]++;
        else if(flag == 3)
            cnt[1]++;
        else if(flag == 2)
            cnt[2]++;
        else if(flag == 1)
            cnt[3]++;
        else
            cnt[4]++;
    }
}

double analyize_ave(int c,int index,int &passed,int &failed)
{
    double sum = 0, ave;
    passed = failed = 0;
    for(int i = 0; i < n; i++)
        if(!removed[i] && (c == 0 || c == cid[i]))
    {
        if(score[i][index] >= 60)
            passed++;
        else
            failed++;
        sum += score[i][index];
    }
    if(passed+failed == 0)
        return 0;
    ave = (double)sum/(double)(passed+failed);
    return ave;
}

void show()
{
    int mod;
    printf("Please enter class ID, 0 for the whole statistics.\n");
    scanf("%d",&mod);

    for(int i = 0; i < 4; i++)
    {
        int passed,failed;
        double ave = analyize_ave(mod,i,passed,failed);
        printf("%s\n",course[i]);
        printf("Average Score: %.2f\n", ave+EPS);
                printf("Number of passed students: %d\n", passed);
                printf("Number of failed students: %d\n", failed);
                printf("\n");
    }

    analyize(mod);
    printf("Overall:\n");
     printf("Number of students who passed all subjects: %d\n", cnt[0]);
        printf("Number of students who passed 3 or more subjects: %d\n", cnt[0]+cnt[1]);
        printf("Number of students who passed 2 or more subjects: %d\n", cnt[0]+cnt[1]+cnt[2]);
        printf("Number of students who passed 1 or more subjects: %d\n", cnt[0]+cnt[1]+cnt[2]+cnt[3]);
        printf("Number of students who failed all subjects: %d\n", cnt[4]);
        printf("\n");
}

int main()
{
    int choice;
    #ifdef LOCAL
    freopen("data.in","r",stdin);
    #endif // LOCAL

    while( (choice = menu()) != 0 )
    {
        switch(choice)
        {
            case 1:add();break;
            case 2:DQ(0);break;
            case 3:DQ(1);break;
            case 4:printf("Showing the ranklist hurts students' self-esteem. Don't do that.\n");break;
            case 5:show();break;
        }
    }

    return 0;
}

象棋(uva1589)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
炮:垂直方向或竖直方向移动任意格子,若想吃棋子,当且仅当二者之间有一颗棋子
车:垂直或水平方向走任意格子,中间不可有棋子
马:日子型,防止蹩马腿
帅:当轮到红方时,帅与将在同一列且中间没有棋子时将军。
注意:本题将军可以吃红子。

#include <bits/stdc++.h>
#define LOCAL
int dir[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };  //将军的四个方向
int hdir[8][2] = { {2,1},{2,-1},{-2,1},{-2,-1},{1,2},{-1,2},{1,-2},{-1,-2} }; //马的八个方向对应马脚为gdir
int board[11][10];
using namespace std;

typedef struct Pos
{
    char type;
    int x;
    int y;
    Pos(char _type = 0, int _x = 0, int _y = 0): type(_type),x(_x),y(_y){}
}Pos;


//判断黑将与当前棋子中间相差棋子数(水平方向)
int hn(int px,int py,int y)
{
     int cnt = 0;
     int low = min(py,y);
     int high = max(py,y);
     for(low += 1; low < high; low++)
     if(board[px][low])
        cnt++;
    return cnt;
}

//垂直方向
int vn(int px,int py,int x)
{
    int cnt = 0;
    int low = min(px,x);
    int high =  max(px,x);
    for(low += 1; low < high; low++)
        if(board[low][py])
        cnt++;
    return cnt;
}

//判断位置是否合理
bool check(int x,int y,int isG)
{
    if(isG)
        return (x >= 1 && x <= 3) && (y >=4 && y <= 6);
    else
        return (x >= 1 && x <= 10) && (y >= 1 && y <= 9);
}

int main()
{
    char type[5];
    int x,y;
    int n, px, py;
    bool live;

    #ifdef LOCAL
    freopen("data.in","r",stdin);
    #endif


    while(scanf("%d%d%d",&n,&px,&py) && n)
    {
        vector<Pos> red;
        bool ans = true;
        memset(board,0,sizeof(board));
        while(n--)
        {
            scanf("%s%d%d",type,&x,&y);
            board[x][y] = 1;
            red.push_back(Pos(type[0],x,y));
        }
        for(int i = 0; i < 4; ++i)
        {
            int xx = px+dir[i][0], yy = py+dir[i][1];
            if(check(xx,yy,1)) //将军位置合法
            {
                live = true;
                for(auto t: red)
                {
                    if(t.x == xx && t.y == yy)  //红子被吃
                        continue;
                    if(t.type == 'G' && yy == t.y && vn(xx,yy,t.x) == 0) live = false;
                    else if(t.type == 'R' && ( (yy == t.y && vn(xx,yy,t.x) == 0) || (xx == t.x && hn(xx,yy,t.y) == 0)) )
                       live = false;
                    else if(t.type == 'C' && ( (yy == t.y && vn(xx,yy,t.x)== 1) || (xx == t.x && hn(xx,yy,t.y) == 1)) )
                        live = false;
                    else if(t.type == 'H'){
                        for(int j = 0; j < 8; ++j)
                        {
                            int hx = t.x+hdir[j][0], hy = t.y+hdir[j][1];
                            int fx = t.x+dir[j/2][0], fy = t.y+dir[j/2][1];
                            if(board[fx][fy])
                                continue;
                            if(hx == xx && hy == yy && check(fx,fy,0)) {live = false;break;}
                        }
                    }

                    if(!live)
                       break;
                }
            }
            if(check(xx,yy,1) && live){
                ans = false;
                break;
            }
        }
        printf("%s\n",ans?"YES":"NO");
    }

    return 0;
}

正方形(uva201)

在这里插入图片描述
在这里插入图片描述

#include <bits/stdc++.h>
#define LOCAL
using namespace std;

int v[10][10];  //存放竖直相连的点
int h[10][10];  //存放水平相连的点

int cnsquare(int l,int n)
{
    int cnt = 0;
    bool flag;
    for(int i = 1; i <= n-l; ++i)
        for(int j = 1; j <= n-l; ++j)
    {
        flag = true;
        for(int k = 0; k < l; ++k)
        {
            if(!h[i][j+k] || !h[i+l][j+k] || !v[i+k][j] || !v[i+k][j+l])
            {
                flag = false;
                break;
            }
        }
        if(flag)
            cnt++;
    }
    return cnt;
}

int main()
{
    int n;
    int t;
    char type[5];
    int x,y;
    int cnt = 0;

    #ifdef LOCAL
    freopen("data.in","r",stdin);
    #endif

    while(~scanf("%d%d",&n,&t))
    {
        memset(h,0,sizeof(h));
        memset(v,0,sizeof(v));
        while(t--)
        {
            scanf("%s%d%d",type,&x,&y);
            if(type[0] == 'H')
                h[x][y] = 1;
            else
                v[y][x] = 1;
        }

        if(cnt)
            { putchar('\n'); printf("**********************************\n");putchar('\n');}
        printf("Problem #%d\n\n",++cnt);

        int f = 0;
        for(int l = 1; l <= n; ++l)
        {
            int ans = cnsquare(l,n);
            if(ans)
                { printf("%d square (s) of size %d\n",ans,l); f = 1;}
        }
        if(!f)
            printf("No completed squares can be found.\n");
    }

    return 0;
}

黑白棋(uva220)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <stdio.h>
#include <string.h>
#define LOCAL
int dir[8][2] = { {1,0},{-1,0},{0,1},{0,-1},{-1,-1},{1,-1},{-1,1},{1,1} };
char board[9][9];
using namespace std;

//斜向的判断(左上组合:-1,-1 右上组合:-1,1 左下组合:1,-1 右下组合:1,1)
bool s_check(char type,int v,int h,int x,int y)
{
    while(true)
    {
        x += v;
        y += h;
        if(x == 0 || x == 9 || y == 0 || y == 9 || board[x][y] == '-')
            break;
        if(board[x][y] == type)
            return true;
    }
    return false;
}

//竖直方向的判断(上:-1 下:1)
bool v_check(char type,int v,int x,int y)
{
    while(true)
    {
        x += v;
         if(x == 0 || x == 9 || board[x][y] == '-')
            break;
        if(board[x][y] == type)
            return true;
    }
    return false;
}

//水平方向的判断(左:-1 右:1)
bool h_check(char type,int h,int x,int y)
{
    while(true)
    {
        y += h;
         if(x == 0 || x == 9 || y == 0 || y == 9 || board[x][y] == '-')
            break;
        if(board[x][y] == type)
            return true;
    }
    return false;
}

//斜向的改变
void s_change(char type,int v,int h,int x,int y)
{
    while(true)
    {
        x += v;
        y += h;
        if(x == 0 || x == 9 || y == 0 || y == 9)
            break;
        if(board[x][y] == type)
            break;
        board[x][y] = type;
    }
}

//横向的改变
void h_change(char type,int h,int x,int y)
{
    while(true)
    {
        y += h;
        if(x == 0 || x == 9 || y == 0 || y == 9 )
            break;
        if(board[x][y] == type)
            break;
        board[x][y] = type;
    }
}

//竖直方向的改变
void v_change(char type,int v,int x,int y)
{
    while(true)
    {
        x += v;
        if(x == 0 || x == 9 || y == 0 || y == 9 )
            break;
        if(board[x][y] == type)
            break;
        board[x][y] = type;
    }
}

void mrc(int x,int y,char type) //type代表该下的棋子
{
    char pos = type == 'W'?'B':'W';
    board[x][y] = type;

    for(int i = 0; i < 8; ++i)
    {
        int xx = x+dir[i][0], yy = y+dir[i][1];
        if(board[xx][yy] != pos)
            continue;
        if(i == 0 || i == 1) //上下
        {
            if(v_check(type,dir[i][0],xx,yy))
            {
                v_change(type,dir[i][0],x,y);
            }
        }
        else if(i == 2 || i == 3) //左右
        {
            if(h_check(type,dir[i][1],xx,yy))
                {
                    h_change(type,dir[i][1],x,y);
                }
        }
        else  //斜向
        {
            if(s_check(type,dir[i][0],dir[i][1],xx,yy))
            {
                s_change(type,dir[i][0],dir[i][1],x,y);
            }
        }
    }

    int b,w;
    b = w = 0;
    for(int i = 1; i <= 8; ++i)
        for(int j = 1; j <= 8; ++j)
    {
        if(board[i][j] == 'W')
            w++;
        else if(board[i][j] == 'B')
            b++;
    }
    printf("Black - %2d White - %2d\n",b,w);
}

int main()
{
    #ifdef LOCAL
    freopen("data.in","r",stdin);
    #endif // LOCAL

    int t;
    scanf("%d",&t);
    getchar();
    int first = 1;
    while(t--)
    {
        if(!first)
        {
            putchar('\n');
        }
        first = 0;
        char ch,type,pos;
        int flag = 1;
        memset(board,0,sizeof(board));
        for(int i = 1; i <= 8; ++i)
        {
            for(int j = 1; j <= 8; ++j)
                scanf("%c",&board[i][j]);
            getchar();
        }
        type = getchar();
        getchar();
        while( ch = getchar())
        {
            if(ch == 'L')
            {
                getchar();
                flag = 0;
                pos = type=='W'?'B':'W';
                int cnt = 0;
                for(int i = 1; i <= 8; ++i)
                    for(int j = 1; j <= 8; ++j)
                {
                    if(board[i][j] == '-')
                    {
                        for(int k = 0 ; k < 8 ; ++k)
                        {
                            int xx = i+dir[k][0],yy = j+dir[k][1];
                            if(board[xx][yy] != pos)
                                continue;
                            if(k == 0 || k == 1)
                            {
                                if(v_check(type,dir[k][0],i,j))
                                       { if(cnt!=0) putchar(' ');printf("(%d,%d)",i,j);cnt++;flag = 1;break;}
                            }
                            else if(k == 2 || k == 3)
                            {
                                if(h_check(type,dir[k][1],i,j))
                                    {if(cnt!=0) putchar(' ');cnt++;printf("(%d,%d)",i,j);flag=1;break;}
                            }
                            else
                            {
                                if(s_check(type,dir[k][0],dir[k][1],i,j))
                                   {
                                       if(cnt!=0) putchar(' ');cnt++;
                                        printf("(%d,%d)",i,j);flag=1;break;
                                   }
                            }
                        }

                    }
                }
                if(flag == 0)
                  printf("No legal move.\n");
                else
                    putchar('\n');
            }
            else if(ch == 'M')
            {
                char num[5];
                scanf("%s",num);
                getchar();
                if(flag == 0)
                    type = type=='W'?'B':'W';
                mrc(num[0]-'0',num[1]-'0',type);
                type = type=='W'?'B':'W';
            }
            else if(ch == 'Q')
            {
                getchar();
                for(int i = 1; i <= 8; ++i){
                   for(int j = 1; j <= 8; ++j)
                    printf("%c",board[i][j]);
                   putchar('\n');
                }
                break;
            }
        }
    }

    return 0;
}

骰子涂色

在这里插入图片描述

#include <stdio.h>
#include <string.h>
#include <iostream>
#define LOCAL

using namespace std;

bool check(char a[],char b[])
{
    for(int i = 1; i <= 6; ++i)
        if(a[i] != b[i])
        return false;

    return true;
}

//x轴右旋n*90度
void x_rotate(char a[],int n)
{
    char a2;
    while(n--)
    {
        a2 = a[2];
        a[2] = a[3];
        a[3] = a[5];
        a[5] = a[4];
        a[4] = a2;
    }
}

//y轴右旋n*90度
void y_rotate(char a[],int n)
{
    char a1;
    while(n--)
    {
        a1 = a[1];
        a[1] = a[3];
        a[3] = a[6];
        a[6] = a[4];
        a[4] = a1;
    }
}

//z轴下旋n*90度
void z_rotate(char a[],int n)
{
    char a2;
    while(n--)
    {
        a2 = a[2];
        a[2] = a[1];
        a[1] = a[5];
        a[5] = a[6];
        a[6] = a2;
    }
}

int main()
{
    char str[16];
    char a[10],b[10],t[10];
    #ifdef LOCAL
    freopen("data.in","r",stdin);
    #endif // LOCAL

    while(~scanf("%s",str))
    {
        for(int i = 0; i < 6; ++i)
            { a[i+1] = str[i]; t[i+1] = str[i];}
        for(int i = 6,j = 1; i < 12; ++i,++j)
            b[j] = str[i];

        bool ischeck = false;
        for(int i = 0; i < 4 && !ischeck; ++i)
            for(int j = 0; j < 4 && !ischeck; ++j)
            for(int k = 0; k < 4 && !ischeck; ++k)
        {
            memcpy(a,t,sizeof(t));
            x_rotate(a,i);
            y_rotate(a,j);
            z_rotate(a,k);
            ischeck = check(a,b);
        }
        printf("%s\n",ischeck?"TRUE":"FALSE");
    }

    return 0;
}

IP网络(uva1590)

在这里插入图片描述

#include <stdio.h>
#include <iostream>
#define LOCAL
using namespace std;

void copyn(int m[],int num[],int n)
{
    for(int i = 0; i < n; ++i)
        m[i] = num[i];
}

void tobianary(int num[],int bi[])
{
    int t;
    for(int i = 0; i < 4; ++i)
    {
        for(int j = i*8+7; j >= i*8; --j)
        {
               t = num[i]%2;
               bi[j] = t;
               num[i] /= 2;
        }
    }
}

void turnback(int num[],int bi[])
{
    for(int i = 0; i < 4; ++i)
    {
        num[i] = 0;
        for(int j = i*8; j <= i*8+7; ++j)
        {
            num[i] = num[i]*2+bi[j];
        }
    }
}

int main()
{
    #ifdef LOCAL
    freopen("data.in","r",stdin);
    #endif // LOCAL

    int n;
    int num[4];
    int ma[4],mi[4];
    int low[36],high[36];

    while(~scanf("%d",&n))
    {
        scanf("%d.%d.%d.%d",&num[0],&num[1],&num[2],&num[3]);
        copyn(ma,num,4);copyn(mi,num,4);
        n--;
        while(n--)
        {
            scanf("%d.%d.%d.%d",&num[0],&num[1],&num[2],&num[3]);
            for(int i = 0; i < 4; ++i)
            {
                if(num[i] > ma[i])
                {
                    copyn(ma,num,4);
                    break;
                }
                else if(num[i] < ma[i])
                    break;
            }
            for(int i = 0; i < 4; ++i)
            {
                if(num[i] < mi[i])
                {
                    copyn(mi,num,4);
                    break;
                }
                else if(num[i] > mi[i])
                    break;
            }
        }

        tobianary(mi,low);
        tobianary(ma,high);
        int cnt = 0;
        for(int i = 0; i < 32; ++i,++cnt)
            if(low[i] != high[i])
            break;

        for(int i = cnt; i < 32; ++i)
            low[i] = 0;

        turnback(num,low);
         for(int i = 0; i < 4; ++i)
            {
                printf("%d",num[i]);
                if(i!=3)
                    putchar('.');
                else
                    putchar('\n');
            }

        int mask[36] = {0};
        for(int i = 0; i < cnt; ++i)
            mask[i] = 1;
        turnback(num,mask);
        for(int i = 0; i < 4; ++i)
            {
                printf("%d",num[i]);
                if(i!=3)
                    putchar('.');
                else
                    putchar('\n');
            }
    }

    return 0;
}

莫尔斯电码(uva508)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <iostream>
#include <string>
#include <vector>
#include <cmath>
#include <map>
#include <iterator>
#define LOCAL
using namespace std;

string code[200];  //存放莫斯编码
map<string,vector<string>> morse;  //Key为莫斯编码,存放着原字符串(可能多个字符串对应一个编码)

int main()
{

    #ifdef LOCAL
    freopen("data.in","r",stdin);
    #endif // LOCAL

    char c;
    string s;
    while(cin >> c && c != '*')
    {
        cin >> code[c];
    }

    while(cin >> s && s != "*")
    {
        string st;
        for(auto p:s)
            st += code[p];
        morse[st].push_back(s);
    }

    while(cin >> s && s != "*")
    {
        if(morse.find(s) != morse.end())
        {
            cout << *morse[s].begin();
            if(morse[s].size() > 1)
                cout << "!";
        }
        else
        {
            int mi = 0x3ffff;
            string ans;
            for(auto p:morse)
            {
                if(p.first.substr(0,s.size()) == s || s.substr(0,p.first.size()) == p.first)
                {
                    int i = abs((long)s.size()-(long)p.first.size());
                    if(mi > i)
                    {
                        mi = i;
                        ans = *p.second.begin();
                    }
                }
            }
            cout << ans << "?";
        }
        cout << endl;
    }

    return 0;
}

RAID技术(uva509)

在这里插入图片描述
在这里插入图片描述

#include <iostream>
#include <string>
#define LOCAL
using namespace std;

char mod;
int b,s,d;
string disk[10];

bool check()
{
    for(decltype(disk[0].size()) i = 0; i < disk[0].size(); ++i)
    {
        int e = mod=='E'?0:1;
        int idx = -1,cnt = 0;
        for(int j = 0; j < d; ++j)
        {
            if(disk[j][i] == 'x') cnt++,idx = j;
            else
                e ^= disk[j][i]-'0';
        }
        if(cnt == 1) disk[idx][i] = e==0?'0':'1';
        else if(cnt > 1 || cnt == 0 && e != 0) return false;
    }
    return true;
}

void show()
{
    const char *dict ="0123456789ABCDEF";
    int num = 0;
    string ans;
    for(int i = 0; i < b; ++i)
        for(int j = 0;j < d; ++j)
        if(i%d != j) ans += disk[j].substr(i*s,s);
    if(ans.size()%4!=0)
        {string t(4-ans.size()%4,'0');ans +=t;}
    for(int i = 0; i < ans.size()/4; ++i)
    {
        string st;
        num = 0;
        st = ans.substr(i*4,4);
        for(int j = 0; j <= 3; ++j)
            num = num*2+st[j]-'0';
        printf("%c",dict[num]);
    }
    putchar('\n');
}

int main()
{
    int cnt = 0;

    #ifdef LOCAL-
    freopen("data.in","r",stdin);
    #endif // LOCAL

    while(scanf("%d",&d) && d)
    {
        scanf("%d%d",&s,&b);
        cin >> mod;
        for(int i = 0; i < d; ++i)
            cin >> disk[i];

        if(check())
        {
            printf("Disk set %d is valid, contents are: ",++cnt);
            show();
        }
        else
        {
            printf("Disk set %d is invalid.\n",++cnt);
        }
    }

    return 0;
}

特别困的学生(uva12108)

在这里插入图片描述
在这里插入图片描述

#include <iostream>
#define LOCAL
using namespace std;

int wnum,n;

bool repe(int save[],int c[])
{
    for(int i = 0; i < n; ++i)
        if(save[i] != c[i])
        return false;
    return true;
}

int weak(int a[],int b[],int c[])
{
    int num = 0;
    for(int i = 0; i < n; ++i)
    {
        c[i] = (c[i]+a[i]+b[i])%(a[i]+b[i])+1;
        if(c[i] > a[i] && c[i] <= a[i]+b[i])
        {
            if(wnum*2 >= n && c[i] == a[i]+1)
               { num++; c[i] = 1;}
        }
        else
            num++;
    }

    return num;
}

int main()
{
    int kase = 0;

    #ifdef LOCAL
    freopen("data.in","r",stdin);
    #endif // LOCAL

    while(scanf("%d",&n) && n)
    {
        int a[12],b[12],c[12],save[12];
        int cnt = 1;
        wnum = 0;
        for(int i = 0; i < n; ++i)
        {
            scanf("%d%d%d",&a[i],&b[i],&c[i]);
            save[i] = c[i];
            if(c[i] <= a[i])
                wnum++;

        }
        printf("Case %d: ",++kase);

        if(wnum == n)
            printf("1\n");
        else{
                while(true)
                {
                    cnt++;
                    wnum = weak(a,b,c);
                    if(wnum == n)
                        { printf("%d\n",cnt);break;}
                    else if(repe(save,c))
                    {
                        printf("-1\n");
                        break;
                    }
                }
        }
    }

    return 0;
}

数据挖掘(uva1591)

在这里插入图片描述
在这里插入图片描述

#include <iostream>
#include <climits>
#define LOCAL
/*
如何判断AB合法:Q数组一个数据占据空间sq,AB合法时偏移量应该大于等于sq
Qofs’(i) = (Pofs(i) + Pofs(i) << A) >> B
其中Pofs每次增加sp可以理解为Q的偏移量每次增加(sp+(sp<<i))>>j必须大于等于sq
*/


/*
计算空间K:有n-1个元素,K为n-1个元素的偏移量加上一个Q元素的空间sq
*/

using namespace std;

int main()
{
    long long n,sp,sq;

    #ifdef LOCAL
    freopen("data.in","r",stdin);
    #endif // LOCAL

    while(~scanf("%lld%lld%lld",&n,&sp,&sq))
    {
        long long k = LLONG_MAX, A, B;

        for(int i = 0; i < 32; ++i)
            for(int j = 0; j < 32; ++j)
        {
            if( (sp+(sp<<i))>>j >= sq && k > ((sp*(n-1)+(sp*(n-1)<<i))>>j)+sq )
            {
                k = ((sp*(n-1)+(sp*(n-1)<<i))>>j)+sq;
                A = i;
                B = j;
            }
        }
        printf("%lld %lld %lld\n",k,A,B);
    }

    return 0;
}

洪水(uva815)

在这里插入图片描述

#include <iostream>
#include <algorithm>
#include <vector>
#define LOCAL
using namespace std;

//注意考虑水的总体积为0

int main()
{
    #ifdef LOCAL
    freopen("data.in","r",stdin);
    #endif // LOCAL

    int n,m;
    int t;
    int sum;
    int kase = 0;
    while(scanf("%d%d",&n,&m) && n)
    {
        int cnt = 1;
        double ans = 0;
        vector<int> v(n*m);
        for(int i = 0; i < n*m; ++i)
        {
          scanf("%d",&t);
          v[i] = t;
        }
        scanf("%d",&sum);
        bool flag = false;
        if(sum == 0) flag = true;
        sort(v.begin(),v.end());
        int h,water;
        for(int i = 0; i < m*n-1; ++i)
        {
            h = v[i+1]-v[i];
            water = h*100*cnt;
            if(water < sum)
            {
                sum -= water;
                cnt++;
            }
            else
             {

               ans = v[i]+(double)sum/(100*cnt);
                sum = 0;
                break;
            }
        }
        if(sum != 0)
        {
            ans = v[m*n-1]+(double)sum/(100*cnt);
        }
        printf("Region %d\n",++kase);
        printf("Water level is %.2lf meters.\n",ans);
        printf("%.2lf percent of the region is under water.\n",flag?0.0:(double)(cnt)/(n*m)*100);

        putchar('\n');
    }

    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值