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

继续搞起,慢慢来,不着急~
代码如下:
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("\nRemaining card: %d\n", 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\n");
            printf("YES\n");
            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\n");
            printf("YES\n");
        else
            //fprintf(fp,"NO\n");
            printf("NO\n");
    }
    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\n", 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\n", 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\n", 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\n";
        else
            cout << "NO\n";
        if (kase)
            cout << "\n";
    }
    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:\n", ++kase);
        bool i = 0;
        while (sum[pos] != 0)
        {
            if (i != 1)
                i = 1;
            else
                cout << " ";
            printf("%d", sum[pos++]);
        }
        printf("\n\n");
    }
    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("\n");
    }
    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\n", 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\n", s);
    fprintf(fp,"%s\n", 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("\n");
            fprintf(fp, "\n");
    }
    if (nodes.size() % 10 != 0)
        //printf("\n");
        fprintf(fp, "\n");
}

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\n");
    fprintf(fp, "  No Solution Possible\n");
}

int main() {
    while (read()) {
        solve();
    }
    fclose(fp);
    return 0;

}
posted @ 2018-04-04 10:38  romaLzhih  阅读(169)  评论(0)    收藏  举报