• 爬格子呀--寒假回来的第一批成果


    继续搞起,慢慢来,不着急~
    代码如下:
    Uva10935,丢掉卡片

    #include<cstdio>
    #include<iostream>
    #include<queue>
    using namespace std;
    deque<int>p, pp;
    
    int main() {
        int n;
        while (scanf("%d", &n)==1 && n != 0) {
            p.clear(), pp.clear();
            for (int i = 1; i <= n; i++)
                p.push_back(i);
            while (p.size() != 1) {
                pp.push_back(p.front()), p.pop_front();
                p.push_back(p.front()), p.pop_front();
            }
            printf("Discarded cards:");
            for (int i = 0; i < pp.size(); i++) {
                if (i == pp.size() - 1)
                    printf(" %d", pp[i]);
                else
                    printf(" %d,", pp[i]);
            }
            printf("
    Remaining card: %d
    ", p[0]);
        }
        return 0;
    }

    Uva1595,对称

    #include<cstdio>
    #include<iostream>
    #include<map>
    #include<cmath>
    #include<utility>
    using namespace std;
    typedef multimap<int, int> Map;
    
    Map p, pp;
    
    int main() {
        //FILE*fp = fopen("stdout.txt", "w");
        int kase = 0, n;
        scanf("%d", &n);
        while (kase++ < n) {
            p.clear(), pp.clear();
            int num, a, b;
            scanf("%d", &num);
            for (int i = 0; i < num; i++) {
                scanf("%d %d", &a, &b);
                p.insert(make_pair(a, b));
            }
            Map::iterator it = p.begin(), itt = --p.end(), ins = p.begin(), tar, mid;
            if (num % 2 == 1) {
                advance(ins, ceil(num / 2));
                p.insert(*ins);
            }
            int sum = it->first + itt->first, flag = 1;
            for (advance(it,p.size()/2); it != p.end(); it++) {
                pp.insert(*it);
            }
            int tot = p.size();
            it = p.begin(), itt = --p.end();
            if (num == 1|| it->first == itt->first) {
                //fprintf(fp,"YES
    ");
                printf("YES
    ");
                continue;
            }
            for (int i = 0; i < p.size() / 2; i++) {
                flag = 0;
                for (itt = pp.begin(); itt != pp.end(); itt++) {
                    if (it->first == itt->first) {
                        flag = 1;
                        pp.erase(itt);
                        break;
                    }
                    if (itt->first + it->first == sum&&itt->second == it->second) {
                        flag = 1;
                        pp.erase(itt);
                        break;
                    }
                }
                if (!flag)
                    break;
                it++;
            }
            if (flag)
                //fprintf(fp,"YES
    ");
                printf("YES
    ");
            else
                //fprintf(fp,"NO
    ");
                printf("NO
    ");
        }
        return 0;
    }

    Uva12100,打印队列

    #include<cstdio>
    #include<iostream>
    #include<queue>
    using namespace std;
    
    int main() {
        int kase;
        scanf("%d", &kase);
        while (kase--) {
            queue<int>p;
            int str[10] = { 0,0,0,0,0,0,0,0,0,0 };
            int n, m, mid, time = 0, pos, level;
            scanf("%d %d", &n, &m);
            for (int i = 0; i < n; i++) {
                scanf("%d", &mid);
                p.push(mid);
                str[mid]++;
                if (i == m) {
                    pos = str[mid];
                    level = mid;
                }
            }
            bool flag = 1;
            for (int i = 9; i > level; i--) {
                while (str[i] != 0) {
                    if (p.front() != i) {
                        if (p.front() == level) {
                            if (pos != 1)
                                pos--;
                            else
                                pos = str[level];
                        }
                        p.push(p.front()), p.pop();
                    }
                    else {
                        p.pop();
                        str[i]--;
                        time++;
                    }
                }
            }
            printf("%d
    ", time + pos);
        }
        return 0;
    }

    算法课第一周作业,颠倒的密码

    #include<cstdio>
    #include<iostream>
    #include<cmath>
    
    int main() {
        int a[100];
        for (int n = 1000; n <= 9999; n++) {
            int ini = n, i = 0, new_num = 0;
            do {
                a[i++] = ini % 10;
                ini /= 10;
            } while (ini);
            int str = i;
            for (int j = 0; j < str; j++, i--) {
                new_num += a[j] * pow(10, i - 1);
            }
            if (new_num == n * 4) {
                printf("%d", new_num);
                break;
            }
        }
        return 0;
    }

    算法课第二周作业,相亲数(素数表打印,数组下表的嵌套)

    #include<cstdio>
    #include<iostream>
    using namespace std;
    const int max = 30000;
    long table[max];
    long flag[max];
    
    int main() {
        for (long i = 2, j = 0; i < max; i++) {
            j = (i << 1);
            while (j < max) {
                table[j] += i;
                j += i;
            }
        }
        for (long i = 2; i < max; i++) {
            if (flag[i] != 0) {
                if (table[i] < max&&(table[table[i] + 1] + 1 == i))
                    printf("%ld and %ld
    ", i, table[i] + 1);
                flag[table[i] + 1] = 1;
            }
        }
        return 0;
    }

    算法课第三周作业,高精度除法

    #include<cstdio>
    #include<iostream>
    using namespace std;
    const int num = 30;//要求除到的精度
    
    int main() {
        int dividend, divisor, mid;//被除数,除数,中间变量
        int str[100] = {};//储存数组
        scanf("%d%d", &dividend, &divisor);
        for (int i = 0; i < num; i++) {
            mid = dividend / divisor;
            if (mid != 0) 
                dividend = 10 * (dividend % divisor);
            else 
                dividend *= 10;
            str[i] = mid;
        }
        printf("%d.", str[0]);
        for (int i = 1; i < num; i++)
            printf("%d", str[i]);
        return 0;
    }

    Uva1596,找bug

    #include<stdio.h>
    #include<iostream>
    #include<string>
    #include<vector>
    #include<map>
    #include<utility>
    using namespace std;
    long long arrlen[100];
    vector<map<string,string>>arrcnt[100];
    
    void clear() {
        map<string, string>a;
        for (int i = 0; i < 58; i++) {
            arrlen[i] = 0;
            arrcnt[i].clear();
            arrcnt[i].push_back(a);
        }
    }
    
    int de_bug(string s, string ss) {
        int pos1, pos2, end1, end2;
        string mid, mid1;
        pos1 = s.find_first_of("0123456789");
        end1 = s.find_last_of("0123456789");
        pos2 = ss.find_first_of("0123456789");
        end2 = ss.find_last_of("0123456789");
        //查找前面的
        mid = s.substr(pos1, end1 - pos1 + 1);
        int j = pos1 - 2;
        for (int i = 0; i < pos1 / 2 - 1; i++) {
            map<string, string>::iterator it = arrcnt[s[j] - 'A'][0].find(mid);
            if (it != arrcnt[s[j] - 'A'][0].end()) {
                if (stoll(it->first) >= arrlen[s[j] - 'A'])
                    return 0;
                mid = it->second;
                j -= 2;
                continue;
            }
            else
                return 0;
        }
        //查找后面的
        mid1 = ss.substr(pos2, end2 - pos2 + 1);
        int jps;
        if (pos2==0) {
            if (stoll(mid) >= arrlen[s[0] - 'A'])
                return 0;
            arrcnt[s[0] - 'A'][0].insert(make_pair(mid, mid1));
            return 1;
        }
        jps = pos2 - 2;
        for (int i = 0; (jps >= 0)||(i < pos1 / 2); i++) {
            map<string, string>::iterator it = arrcnt[ss[jps] - 'A'][0].find(mid1);
            if (it != arrcnt[ss[jps] - 'A'][0].end()) {//查找到了
                if (stoll(it->first) >= arrlen[ss[jps] - 'A'])
                    return 0;
                mid1 = it->second;
                jps -= 2;
                continue;
            }
            else
                return 0;
        }
        arrcnt[s[0] - 'A'][0].insert(make_pair(mid, mid1));
        return 1;//没错返回1
    }
    
    int main() {
        string s;
        while (cin >> s && s != ".") {
            clear();
            int bug = 0, line = 0;
            do {
                line++;
                int eq_pos = s.find('=');
                if (eq_pos == -1)
                    arrlen[s[0] - 'A'] = stoll(s.substr(2, s.size() - 3));
                else
                    if (!bug&&!de_bug(s.substr(0, eq_pos), s.substr(eq_pos + 1, s.size() - eq_pos - 1)))
                        bug = line;
            } while (cin >> s && s != ".");
            printf("%d
    ", bug);
        }
        return 0;
    }

    Uva839,天平

    #include<cstdio>
    #include<iostream>
    using namespace std;
    
    bool cret(int& w) {
        int wl, dl, wr, dr;
        scanf("%d%d%d%d", &wl, &dl, &wr, &dr);
        bool a1 = true, a2 = true;
        if (wl == 0) 
            a1=cret(wl);
        if (wr == 0)
            a2=cret(wr);
        w = wl + wr;
        return a1&&a2&&wl*dl == wr*dr;
    }
    
    int main() {
        int kase, w;
        scanf("%d", &kase);
        while (kase--) {
            if (cret(w))
                cout << "YES
    ";
            else
                cout << "NO
    ";
            if (kase)
                cout << "
    ";
        }
        return 0;
    }

    Uva699,下落的树叶

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    const int maxn = 10000;
    int sum[maxn];
    
    void build(int pos) {
        int v;
        scanf("%d", &v);
        if (v == -1)
            return;
        sum[pos] += v;
        build(pos - 1);
        build(pos + 1);
    }
    
    bool ini() {
        int v;
        scanf("%d", &v);
        if (v == -1)
            return false;
        memset(sum, 0, sizeof(sum));
        int pos = maxn / 2;
        sum[pos] = v;
        build(pos - 1);
        build(pos + 1);
    }
    
    int main() {
        int kase = 0;
        while (ini()) {
            int pos = maxn / 2;
            while (sum[pos] != 0)
                pos--;
            ++pos;
            printf("Case %d:
    ", ++kase);
            bool i = 0;
            while (sum[pos] != 0)
            {
                if (i != 1)
                    i = 1;
                else
                    cout << " ";
                printf("%d", sum[pos++]);
            }
            printf("
    
    ");
        }
        return 0;
    }

    Uva1103,埃及文字(dfs求联通快)

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<set>
    #include<vector>
    #include<cstring>
    using namespace std;
    char bin[256][5];
    const int maxh = 200 + 5;
    const int maxw = 50 * 4 + 5;
    int H, W, pic[maxh][maxw], color[maxh][maxw];//pic为像素矩阵,color为标记数组
    char line[maxw];
    const int dr[] = { -1,1,0,0 };
    const int dc[] = { 0,0,-1,1 };
    vector<set<int>>neighbors;
    const char* code = "WAKJSD";
    
    void decode(char ch, int r, int c) {
        for (int i = 0; i < 4; i++) {
            pic[r][c + i] = bin[ch][i] - '0';
        }
    }
    
    void dfs(int row, int col, int c) {
        color[row][col] = c;
        for (int i = 0; i < 4; i++) {
            int row2 = row + dr[i];
            int col2 = col + dc[i];
            if (row2 >= 0 && row2 < H && col2 >= 0 && col2 < W&&pic[row2][col2] == pic[row][col] && color[row2][col2] == 0) {
                dfs(row2, col2, c);
            }
        }
    }
    //查看一个颜色的块周围的其他颜色的快有多少种,1为白色,不算
    void check_neighbors(int row,int col) {
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                int row2 = row + dr[i];
                int col2 = col + dc[i];
                if (row2 >= 0 && row2 < H && col2 >= 0 && col2 < W && pic[row2][col2] == 0 && color[row2][col2] != 1)
                    neighbors[color[row][col]].insert(color[row2][col2]);
            }
        }
    
    }
    
    char recognize(int c) {
        int cnt = neighbors[c].size();
        return code[cnt];
    }
    
    int main(){
        strcpy(bin['0'], "0000");
        strcpy(bin['1'], "0001");
        strcpy(bin['2'], "0010");
        strcpy(bin['3'], "0011");
        strcpy(bin['4'], "0100");
        strcpy(bin['5'], "0101");
        strcpy(bin['6'], "0110");
        strcpy(bin['7'], "0111");
        strcpy(bin['8'], "1000");
        strcpy(bin['9'], "1001");
        strcpy(bin['a'], "1010");
        strcpy(bin['b'], "1011");
        strcpy(bin['c'], "1100");
        strcpy(bin['d'], "1101");
        strcpy(bin['e'], "1110");
        strcpy(bin['f'], "1111");
    
        //边读入边解码
        int kase = 0;
        while (scanf("%d%d", &H, &W) == 2 && H) {
            memset(pic, 0, sizeof(pic));
            for (int i = 0; i < H; i++) {
                scanf("%s", line);
                for (int j = 0; j < W; j++) {
                    decode(line[j], i + 1, j * 4 + 1);
                }
            }
    
            H += 2;
            W = W * 4 + 2;
            //求联通快,并依次标记编号
            int cnt = 0;
            vector<int>cc;
            memset(color, 0, sizeof(color));
            for (int i = 0; i < H; i++) {
                for (int j = 0; j < W; j++) {
                    if (!color[i][j]) {
                        dfs(i, j, ++cnt);
                        if (pic[i][j] == 1)
                            cc.push_back(cnt);
                    }
                }
            }
            neighbors.clear();
            neighbors.resize(cnt + 1);
            for (int i = 0; i < H; i++) {
                for (int j = 0; j < W; j++) {
                    if (pic[i][j] == 1)
                        check_neighbors(i, j);
                }
            }
    
            vector<char>ans;
            for (int i = 0; i < cc.size(); i++) {
                ans.push_back(recognize(cc[i]));
            }
            sort(ans.begin(), ans.end());
    
            printf("Case %d: ", ++kase);
            for (int i = 0; i < ans.size(); i++) {
                printf("%c", ans[i]);
            }
            printf("
    ");
        }
        return 0;
    }

    Uva572,油田(dfs求联通快)

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    const int maxn = 100 + 5;
    char pic[maxn][maxn];
    int m, n, id[maxn][maxn];
    
    void dfs(int row, int col, int c) {
        if (row < 0 || row>=m || col < 0 || col>=n) {
            return;
        }
        if (id[row][col] > 0 || pic[row][col] != '@') {
            return;
        }
        id[row][col] = c;
        for (int i = -1; i<2; i++) {
            for (int j = -1; j<2; j++) {
                if (i != 0 || j != 0) {
                    dfs(row+i, col+j, c);
                }
            }
        }
    
    }
    
    int main() {
        while (scanf("%d %d", &m, &n) == 2 && n&&m) {
            for (int i = 0; i<m; i++) {
                scanf("%s", pic[i]);
            }
            memset(id, 0, sizeof(id));
            int cnt = 0;
            for (int i = 0; i<m; i++) {
                for (int j = 0; j<n; j++){
                    if (id[i][j] == 0 && pic[i][j] == '@')
                        dfs(i, j, ++cnt);
                }
            }
            printf("%d
    ", cnt);
        }
        return 0;
    }

    Uva816,Abott的复仇(dfs加抽象路径判断)

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<vector>
    #include<queue>
    using namespace std;
    FILE* fp = fopen("stdout.txt", "w");
    
    struct Node {
        int r, c, dir;
        Node(int r = 0, int c = 0, int dir = 0) :r(r), c(c), dir(dir) {}
    };
    
    const int maxn = 10;
    const char* dirs = "NESW";
    const char* turns = "FLR";
    int eage[maxn][maxn][4][3];
    int d[maxn][maxn][4];
    Node p[maxn][maxn][4];
    int r0, c0, dir, r1, c1, r2, c2;
    
    int dir_id(char c) { return strchr(dirs, c) - dirs; }
    int turn_id(char c) { return strchr(turns, c) - turns; }
    
    const int dr[] = { -1,0,1,0 };
    const int dc[] = { 0,1,0,-1 };
    
    Node walk(const Node&u, int turn) {
        int dir = u.dir;
        if (turn == 1)dir = (dir + 3) % 4;
        if (turn == 2)dir = (dir + 1) % 4;
        return Node(u.r + dr[dir], u.c + dc[dir], dir);
    }
    
    bool read() {
        char s[99], ss[99];
        if (scanf("%s%d%d%s%d%d", s, &r0, &c0, ss, &r2, &c2) != 6)
            return false;
        //printf("%s
    ", s);
        fprintf(fp,"%s
    ", s);
    
        dir = dir_id(ss[0]);
        r1 = r0 + dr[dir];
        c1 = c0 + dc[dir];
    
        memset(eage, 0, sizeof(eage));
        for (;;) {
            int r, c;
            scanf("%d", &r);
            if (r == 0)
                break;
            scanf("%d", &c);
            while (scanf("%s", s) == 1 && s[0] != '*')
                for (int i = 1; i < strlen(s); i++)
                    eage[r][c][dir_id(s[0])][turn_id(s[i])] = 1;
        }
        return true;
    }
    
    bool inside(int r,int c) {
        return r >= 1 && r <= 9 && c >= 1 && c <= 9;
    }
    
    void print(Node uu) {
        vector<Node>nodes;
        for (;;) {
            nodes.push_back(uu);
            if (d[uu.r][uu.c][uu.dir] == 0)
                break;
            uu = p[uu.r][uu.c][uu.dir];
        }
        nodes.push_back(Node(r0, c0, dir));
    
        int cnt = 0;
        for (int i = nodes.size() - 1; i >= 0; i--) {
            if (cnt % 10 == 0)
                //printf(" ");
                fprintf(fp, " ");
            //printf(" (%d,%d)", nodes[i].r, nodes[i].c);
            fprintf(fp, " (%d,%d)", nodes[i].r, nodes[i].c);
            if (++cnt % 10 == 0)
                //printf("
    ");
                fprintf(fp, "
    ");
        }
        if (nodes.size() % 10 != 0)
            //printf("
    ");
            fprintf(fp, "
    ");
    }
    
    void solve() {
        queue<Node>q;
        memset(d, -1, sizeof(d));
        Node u(r1, c1, dir);
        d[u.r][u.c][u.dir] = 0;
        q.push(u);
        while (!q.empty()) {
            Node uu = q.front(); q.pop();
            if (uu.r == r2&&uu.c == c2) {
                print(uu);
                return;
            }
            for (int i = 0; i < 3; i++) {
                Node v = walk(uu, i);
                if (eage[uu.r][uu.c][uu.dir][i] && inside(v.r, v.c) && d[v.r][v.c][v.dir] < 0) {
                    d[v.r][v.c][v.dir] = d[uu.r][uu.c][uu.dir] + 1;
                    p[v.r][v.c][v.dir] = uu;
                    q.push(v);
                }
            }
        }
        //printf("  No Solution Possible
    ");
        fprintf(fp, "  No Solution Possible
    ");
    }
    
    int main() {
        while (read()) {
            solve();
        }
        fclose(fp);
        return 0;
    
    }
  • 相关阅读:
    C#在与java对接时候的UrlEncode的坑
    sql server 删除大量数据的一次坑爹之旅
    js实现黑客帝国文字下落效果
    第一个SignalR案例
    简单的放天灯动画
    计量单位符号的书写规范【转】
    阿里云OSS搭建移动应用直传服务的.Net C#示例
    UWP Windows10开发更新磁贴和动态更新磁贴
    UWP Windows10开发获取设备位置(经纬度)
    Asp.Net识别手机访问
  • 原文地址:https://www.cnblogs.com/romaLzhih/p/9489848.html
Copyright © 2020-2023  润新知