zoukankan      html  css  js  c++  java
  • 爬格子呀--IEEE极限编程大赛留念

    10.14,坐标:电子科技大学
    24h,不间断的编程,感觉还是很爽的。
    排名一般,但是这是开始,未来还很远。

    题目举例1:
    广袤的非洲大草原上,狮子居住在一个个的网格里,他们的势力范围会以曼哈顿路程的的方式给出,求出哪个狮子重叠在其他狮子领地里的次数最少。
    代码如下:

    #include<stdio.h>
    #include<algorithm>
    #include<iostream>
    #include<vector>
    #include<map>
    #include<set>
    #include<utility>
    using namespace std;
    int n, m, k, ri, ci, di;
    int sign[1000][1000];
    
    void draw() {
        int i, j;
        for (i = ri - di + 1; i < ri+di; i++) {
            for (j = ci - di + 1; j < ci+di; j++) {
                if (i < 0 || j < 0 || i >= n || j >= m)
                    continue;
                if (i == ri&&j == ci) {
                    sign[i][j]--;
                }
                sign[i][j]++;
            }
        }
        int row1, row2, col1, col2;
        if ((row1 = ri - di) >= 0) sign[row1][ci]++;
        if ((row2 = ri + di) < n) sign[row2][ci]++;
        if ((col1 = ci - di) >= 0) sign[ri][col1]++;
        if ((col2 = ci + di) < m) sign[ri][col2]++;
    }
    
    int main() {
        vector<int>row, col;
        map<int, vector<int>>s;
        cin >> n >> m >> k;
        int i = 0;
        while (i++ < k) {
            cin >> ri >> ci >> di;
            ri--; ci--;
            row.push_back(ri);
            col.push_back(ci);
            draw();
        }
        i = 0;
        vector<int>::iterator it = row.begin(), ittt = col.begin();
        set<int>ss;
        while (i++ < k) {
            s.insert(make_pair(sign[*it][*ittt], i));
            it++;
            ittt++;
        }
        map<int, vector<int>>::iterator tar = s.end();
        advance(tar, -1);
        sort(tar->second.begin(), tar->second.end());
        cout << *(tar->second).begin() << " " << tar->first;
        return 0;
    }

    题目举例2:
    有一堆人,每个人都有身高,将人按身高排序,同样身高的放到一行,同时按名字排序,每一行的最后输出这一行人的始编号和末编号,
    代码如下:

    #include<stdio.h>
    #include<iostream>
    #include<map>
    #include<vector>
    #include<string>
    #include<utility>
    #include<algorithm>
    using namespace std;
    multimap<int, string>num;
    int n;
    int main() {
        cin >> n;
        int t = 0, height;
        string s;
        while (t < n) {
            cin >> s >> height;
            num.insert(make_pair(height, s));
            t++;
        }
        vector<string>store[1000];
        multimap<int, string>::iterator it = num.begin(), itt = num.begin();
        int k = 0;
        for (; it != num.end(); it++) {
            if (it->first == itt->first) {
                store[k].push_back(it->second);
            }
            else {
                k++;
                itt = it;
                store[k].push_back(it->second);
            }
        }
        vector<string>::iterator iet;
        int time = 0, init = 1;
        for (int j = 0; j <= k; j++) {
            sort(store[j].begin(), store[j].end());
            for (iet = store[j].begin(); iet != store[j].end(); iet++) {
                cout << *iet << " ";
                time++;
            }
            printf("%d %d
    ", init, time);
            init = time+1;
        }
        return 0;
    }

    题目举例3:
    有一个n*n的地图,你从(0,0)出发,目的地是(n,n), 一路上只能像下走或者向右走,每个格子都有血药或者毒药,走上去会按药的数量扣血或加血,计算开始时的应该有的最低血量。
    代码如下:

    #include<stdio.h>
    #include<iostream>
    #include<vector>
    using namespace std;
    int r, c, health;
    int rev_div[2][2] = { {-1,0},{0,-1} };
    //vector<vector<int>>step;
    
    struct {
        int potion;
        bool state = false;
    }unit[1000][1000];
    
    void init() {
        int i = 0, j = 0;
        while (i < r) {
            unit[i][0].potion += unit[i + rev_div[0][0]][0].potion;
            i++;
        }
        while (j < c) {
            unit[0][j].potion += unit[0][j + rev_div[1][1]].potion;
            j++;
        }
    }
    
    int main() {
        cin >> r >> c;
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                cin >> unit[i][j].potion;
            }
        }
    //  struct type position;
        init();
        int mid = 0;
        while (1) {
            int i = 1, j = 1;
            while (i < r) {
                while (j < c) {
                    mid = unit[i + rev_div[0][0]][j + rev_div[0][1]].potion > unit[i + rev_div[1][0]][j + rev_div[1][1]].potion ? unit[i + rev_div[0][0]][j + rev_div[0][1]].potion : unit[i + rev_div[1][0]][j + rev_div[1][1]].potion;
                    unit[i][j].potion += mid;
                    j++;
                }
                j = 1;
                i++;
            }
            health = (unit[r-1][c-1].potion > 1 ? 1 : 1 - unit[r-1][c-1].potion);
            break;
        }
        cout << health;
        return 0;
    }

    题目举例4:
    这道题就是生命游戏的实现,要求左边界与右边界相接,上边界与下边界相接,输出迭代n次后的结果。
    代码如下:
    1: 啰里啰唆版:

    #include<cstdio>
    #include<iostream>
    using namespace std;
    char cell[26][26], new_cell[26][26];
    int n, m, c;
    
    int get_neigh(int row,int col) {
        int count=0, i, j;
        //左上
        if (row == 0 && col == 0) {
            if (cell[0][1] == '*') count++;
            if (cell[1][1] == '*') count++;
            if (cell[1][0] == '*') count++;
            if (cell[n-1][0] == '*') count++;
            if (cell[n-1][1] == '*') count++;
            if (cell[n-1][m-1] == '*') count++;
            if (cell[0][m-1] == '*') count++;
            if (cell[1][m-1] == '*') count++;
            return count;
    
        }
        //左下
        else if (row == n-1 && col == 0) {
            if (cell[n-2][0] == '*') count++;
            if (cell[n-1][1] == '*') count++;
            if (cell[n-2][1] == '*') count++;
            if (cell[n - 1][m-1] == '*') count++;
            if (cell[n - 2][m-1] == '*') count++;
            if (cell[0][0] == '*') count++;
            if (cell[0][1] == '*') count++;
            if (cell[0][m - 1] == '*') count++;
            return count;
        }
        //右上
        else if (row == 0 && col == m - 1) {
            if (cell[0][0] == '*') count++;
            if (cell[1][0] == '*') count++;
            if (cell[0][m - 2] == '*') count++;
            if (cell[1][m - 2] == '*') count++;
            if (cell[1][m - 1] == '*') count++;
            if (cell[n - 1][0] == '*') count++;
            if (cell[n - 1][m - 2] == '*') count++;
            if (cell[n - 1][m - 1] == '*') count++;
            return count;
        }
        //右下
        else if (row == n-1 && col == m-1) {
            if (cell[0][0] == '*') count++;
            if (cell[n-1][m-2] == '*') count++;
            if (cell[n-2][m - 2] == '*') count++;
            if (cell[n-2][m - 1] == '*') count++;
            if (cell[n-1][0] == '*') count++;
            if (cell[n - 2][0] == '*') count++;
            if (cell[0][m - 2] == '*') count++;
            if (cell[0][m - 1] == '*') count++;
            return count;
        }
        //首行
        else if (row == 0) {
            for (i = row; i <= row + 1; i++) {
                for (j = col - 1; j <= col + 1; j++) {
                    if (cell[i][j] == '*')
                        count++;
                }
            }
            for (j = col - 1; j <= col + 1; j++) {
                if (cell[n-1][j] == '*')
                    count++;
            }
            if (cell[row][col] == '*')
                count--;
            return count;
        }
        //末行
        else if (row == n - 1) {
            for (i = row-1; i <= row; i++) {
                for (j = col - 1; j <= col + 1; j++) {
                    if (cell[i][j] == '*')
                        count++;
                }
            }
            for (j = col - 1; j <= col + 1; j++) {
                if (cell[0][j] == '*')
                    count++;
            }
            if (cell[row][col] == '*')
                count--;
            return count;
        }
        //首列
        else if (col == 0) {
            for (i = row-1; i <= row + 1; i++) {
                for (j = col ; j <= col + 1; j++) {
                    if (cell[i][j] == '*')
                        count++;
                }
            }
            for (i = row - 1; i <= row + 1; i++) {
                if (cell[i][m-1] == '*')
                    count++;
            }
            if (cell[row][col] == '*')
                count--;
            return count;
        }
        //末列
        else if (col == m) {
            for (i = row - 1; i <= row + 1; i++) {
                for (j = col-1; j <= col ; j++) {
                    if (cell[i][j] == '*')
                        count++;
                }
            }
            for (i = row - 1; i <= row + 1; i++) {
                if (cell[i][0] == '*')
                    count++;
            }
            if (cell[row][col] == '*')
                count--;
            return count;
        }
        //一般
        else {
            for (i = row - 1; i <= row + 1; i++) {
                for (j = col - 1; j <= col + 1; j++) {
                    if (cell[i][j] == '*')
                        count++;
                }
            }
            if (cell[row][col] == '*')
                count--;
            return count;
        }
    }
    
    int main() {
        cin >> n >> m >> c;
        int i, j;
        for (i = 0; i < n; i++) {
            for (j = 0; j < m; j++) {
                cin >> cell[i][j];
            }
        }
        int kase = 0;
        while (kase < c) {
            for (i = 0; i < n; i++)
            {
                for (j = 0; j < m; j++)
                {
                    switch (get_neigh(i, j))
                    {
                    case 0:
                    case 1:
                    case 4:
                    case 5:
                    case 6:
                    case 7:
                    case 8:
                        new_cell[i][j] = '-';
                        break;
                    case 2:
                        new_cell[i][j] = cell[i][j];
                        break;
                    case 3:
                        new_cell[i][j] = '*';
                        break;
                    }
                }
            }
            kase++;
        }
        cout << endl;
        for (i = 0; i < n; i++) {
            for (j = 0; j < m; j++) {
                cout << cell[i][j];
            }
            cout << endl;
        }
        return 0;
    }

    代码举例2:
    这个最后改的挺多的,其实按照第一个的大思路然后把拿这个的邻居计算思路就行。

    #include<cstdio>
    #include<iostream>
    #include<vector>
    using namespace std;
    
    int n, m, c;
    //获取邻居数;
    int get_neigh(int row, int col, char (*cell)[26]) {
        int count = 0, i, j;
        for (i = -1; i <= 1; i++) {
            for (j = -1; j <= 1; j++) {
                if (cell[(row + i + n) % n][(col + j + m) % m] == '*')
                    count++;
            }
        }
        if (cell[row][col] == '*')
            count--;
        return count;
    }
    
    void change(char (*mat1)[26], char (*mat2)[26]) {
        int i, j, num;
        for (i = 0; i < n; i++)
        {
            for (j = 0; j < m; j++)
            {
                num = get_neigh(i, j, mat1);
                if (num == 2)  mat2[i][j] = mat1[i][j];
                else if (num == 3) {
                    mat2[i][j] = '*';
                }
                else {
                    mat1[i][j] = '-';
                }
            }
        }
    }
    
    int main() {
        char cell[26][26], new_cell[26][26] = {};
        cin >> n >> m >> c;
        int i, j;
        for (i = 0; i < n; i++) {
            for (j = 0; j < m; j++) {
                cin >> cell[i][j];
            }
        }
        int kase = 1;
        while (kase <= c) {
            if (kase % 2 != 0)
                change(cell, new_cell);
            else
                change(new_cell, cell);
            kase++;
        }
        for (i = 0; i < n; i++) {
            for (j = 0; j < m; j++) {
                cout << new_cell[i][j];
            }
            cout << endl;
        }
        return 0;
    }
    

    题目举例5:有好多个长方形,每个长方形中间都会包一个小的长方形,大长方形已经内部已经一个一个小格的依次编号,题目会给出你小长方形的两个对角线顶点,计算每个长方形在小长方形之外的所有数字的异或和

    代码如下:

    #include<stdio.h>
    #include<iostream>
    #include<set>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    long long xor1;
    int t;
    set<int>s;
    
    struct {
        int l, h, d1, d2;
        long long val;
        int length, width, position;
    }rec[100];
    
    int main() {
        cin >> t;
        int i = 0, j = 0;
        while (i < t) {
            cin >> rec[i].l >> rec[i].h >> rec[i].val >> rec[i].d1 >> rec[i].d2;
            int a1, a2, b1, b2, min1, min2;
            a1 = (rec[i].d1 - rec[i].val + 1) % rec[i].l;
            a2 = (rec[i].d2 - rec[i].val + 1) % rec[i].l;
            b1 = (rec[i].d1 - rec[i].val + 1) / rec[i].l;
            b2 = (rec[i].d2 - rec[i].val + 1) / rec[i].l;
            min1 = a1 > a2 ? a2 : a1;
            min2 = b1 > b2 ? b2 : b1;
            rec[i].position = rec[i].l*min2 + min1;
            rec[i].length = abs(a1 - a2) + 1;
            rec[i].width = abs(b1 - b2) + 1;
            i++;
        }
        set<int>::iterator it ,itt;
        for (i = 0; i < t; i++) {
            j = 0;
            while (j < rec[i].l*rec[i].h) {
                s.insert(rec[i].val++);
                j++;
            }
            it = s.begin();
            advance(it, rec[i].position-1);
            itt = it;
            advance(it, rec[i].length);
            for (j = 0; j < rec[i].width; j++) {
                s.erase(itt, it);
                itt = it;
                advance(it, rec[i].l);
                advance(itt, rec[i].l - rec[i].length);
            }
            itt = it = s.begin();
            for (; it != s.end(); it++) {
                xor1 ^= *it;
            }
            cout << xor1 << endl;
            xor1 = 0;
            s.clear();
        }
        return 0;
    }

    题目举例6:求斐波那契数列的前n项值(这个n上界是22400)
    代码举例:

    #include <iostream>
    #include<stdio.h>
    #include<vector>
    #include<string>
    #include<algorithm>
    #include<string.h>
    #include<queue>
    using namespace std;
    
    struct Bigintegar {
        static const int BASE = 100000000;
        static const int WIDTH = 8;
        vector<int>s;
    
        Bigintegar(long long num = 0) { *this = num; }
        Bigintegar operator = (long long num) {
            s.clear();
            do {
                s.push_back(num%BASE);
                num /= BASE;
            } while (num > 0);
            return *this;
        }
        Bigintegar operator=(const string& str) {
            s.clear();
            int x, len = (str.length() - 1) / WIDTH + 1;
            for (int i = 0; i < len; i++) {
                int end = str.length() - i*WIDTH;
                int start = max(0, end - WIDTH);
                sscanf(str.substr(start, end - start).c_str(), "%d", &x);
                s.push_back(x);
            }
            return *this;
        }
        Bigintegar operator + (const Bigintegar& b)const {
            Bigintegar c;
            c.s.clear();
            for (int i = 0, g = 0;; i++) {
                if (g == 0 && i >= s.size() && i >= b.s.size()) break;
                int x = g;
                if (i < s.size())x += s[i];
                if (i < b.s.size())x += b.s[i];
                c.s.push_back(x%BASE);
                g = x / BASE;
            }
            return c;
        }
    };
    ostream& operator<<(ostream &out, const Bigintegar& x) {
        out << x.s.back();
        for (int i = x.s.size() - 2; i >= 0; i--) {
            char buf[20];
            sprintf(buf, "%08d", x.s[i]);
            for (int j = 0; j < strlen(buf); j++) out << buf[j];
        }
        return out;
    }
    
    Bigintegar fibMinus1 = 1;
    Bigintegar fibMinus2 = 2;
    Bigintegar fibN;
    
    Bigintegar step(int n)
    {
        for (int i = 2; i < n; i++)
        {
            fibN = fibMinus1 + fibMinus2;
            fibMinus1 = fibMinus2;
            fibMinus2 = fibN;
        }
        return fibN;
    }
    
    int main()
    {
        int s, kase;
        int t, i = 0, k;
        cin >> t;
        while (i<t) {
            cin >> k;
            i++;
    
        }
        i = 0;
    
    }
  • 相关阅读:
    DEDE调用当前文档中TAG标签利于内页优化提高收录量
    DEDE搜索结果将按点击排序展现方式的修改方法
    win 03 系统 IIS无法解析PHP之解决办法
    【原创】广告调用类,支持Flash调用
    中英文语言转换类
    PHP 获取内网用户MAC地址(WINDOWS/linux)解决方案
    DEDE删除文章怎么同时也删除附件,DEDE删除文章同时删除附件
    windows 2003下配置php环境
    When is a Test not a Unit Test?
    IBM WebSphere Commerce Front_dev
  • 原文地址:https://www.cnblogs.com/romaLzhih/p/9489857.html
Copyright © 2011-2022 走看看