爬格子呀--第三章课后习题

要开始期末复习了

代码如下:
Uva252迷宫

#include<cstdio>
#include<iostream>
#include<string.h>
using namespace std;

char a[15][15];
int b[15][15], r, c;

bool check(int x, int y) {
    return a[x - 1][y] == '*' || a[x][y - 1] == '*';
}

int main() {
    int kase = 1;
    bool kk = true;
    //FILE*fp = fopen("stdout.txt", "w");
    while (scanf("%d", &r) && r != 0) {
        scanf("%d", &c);
        getchar();
        memset(a, '0', sizeof(a));
        memset(b, 0, sizeof(b));
        int num = 1;
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                scanf("%c", &a[i][j]);
                if ((i == 0 || j == 0 || check(i, j)) && a[i][j] != '*')
                    b[i][j] = num++;
            }
            getchar();
        }
        if (!kk) {
            printf("\n");
        }
        kk = false;
        printf("puzzle #%d:\nAcross\n", kase++);
        for (int i = 0; i < r; i++)
            for (int j = 0; j < c; j++)
                if (b[i][j] != 0) {
                    int k = j;
                    printf("%3d.", b[i][k]);
                    for (; a[i][k] != '*'&&k < c; k++)
                        printf("%c", a[i][k]);
                    j = k;
                    printf("\n");
                }
        printf("Down\n");
        for (int i = 0; i < r; i++)
            for (int j = 0; j < c; j++)
                if (b[i][j] != 0) {
                    int k = i;
                    printf("%3d.", b[k][j]);
                    for (; a[k][j] != '*' && k < r; k++) {
                        printf("%c", a[k][j]);
                        b[k][j] = 0;
                    }
                    printf("\n");
                }
    }
    return 0;
}

Uva1368DNA序列

#include<cstdio>
#include<iostream>
#include<map>
#include<algorithm>
#include<vector>
using namespace std;
typedef pair<char, int> P;

struct cmd {
    bool operator()(const P& a, const P& b) {
        return a.second > b.second;
    }
};

int main() {
    int kase, m, n;
    scanf("%d", &kase);
    while (kase--) {
        scanf("%d %d", &m, &n);
        map<char, int>tar;
        char a[50][1000] = {}, ans[1000] = {};
        int num = 0;
        tar.insert({ 'A',0 });
        tar.insert({ 'G',0 });
        tar.insert({ 'C',0 });
        tar.insert({ 'T',0 });
        for (int i = 0; i < m; i++)
            scanf("%s", a[i]);
        for (int j = 0; j < n; j++) {
            for (int i = 0; i < m; i++) {
                tar[a[i][j]]++;
            }
            vector<P>store(tar.begin(), tar.end());
            sort(store.begin(), store.end(), cmd());
            bool flag = true;
            int k;
            char c = store[0].first;
            for (k = 0; k < 3; k++) {
                if (store[k].second != store[k + 1].second) {
                    flag = false;
                    break;
                }
                c = min(c, store[k + 1].first);
            }
            num += (m - store[0].second);
            if (k == 0)
                ans[j] = store[0].first;
            else
                ans[j] = c;
            for (map<char, int>::iterator it = tar.begin(); it != tar.end(); it++)
                it->second = 0;
        }
        printf("%s\n%d\n", ans, num);
    }
    return 0;
 }

Uva202循环小数位数

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long LL;

int main() {
    int n, m, a, b;
    bool time = true;
    //FILE* fp;
    //fp = fopen("stdout.txt", "w");
    while (scanf("%d %d", &a, &b)!=EOF) {

        //if (a == 7777)
        //  break;
        //if (!time)
        //  printf("\n");
        //time = false;
        n = a, m = b;
        vector<int>v, store;
        if (n == 0) {
            printf("%d/%d = 0.(0)\n   1 = number of digits in repeating cycle\n\n", n, m);
            //fprintf(fp, "%d/%d = 0.(0)\n   1 = number of digits in repeating cycle\n\n", n, m);
            continue;
        }
        store.push_back(n / m);
        n = n % m;
        bool flag = false;
        int kase = 0;
        int num, start;
        for (;;) {
            v.push_back(n);
            n *= 10;
            store.push_back(n / m);
            n = n % m;
            if (n == 0) {
                flag = true;
                break;
            }
            if (find(v.begin(), v.end(), n) != v.end()) {
                start = find(v.begin(), v.end(), n) - v.begin();
                num = v.size() - start;
                break;
            }
        }
        printf("%d/%d = %d.", a, b, store[0]);
        //fprintf(fp,"%d/%d = %d.", a, b, store[0]);
        if (flag) {
            if (store[1] == 0 && store.size() == 2) {
                printf("(0)\n   1 = number of digits in repeating cycle\n\n");
                //fprintf(fp, "(0)\n   1 = number of digits in repeating cycle\n\n");
                continue;
            }
            for (int i = 1; i < store.size(); i++)
                printf("%d", store[i]);
                //fprintf(fp,"%d", store[i]);
            printf("(0)\n   1 = number of digits in repeating cycle\n\n");
            //fprintf(fp,"(0)\n   1 = number of digits in repeating cycle\n\n");
        }
        else {
            for (int i = 1; i <= start; i++)
                printf("%d", store[i]);
                //fprintf(fp,"%d", store[i]);
            printf("(");
            //fprintf(fp,"(");
            for (int i = start+1; i <= (num > 50 ? 50 : store.size() - 1); i++)
                printf("%d", store[i]);
                //fprintf(fp,"%d", store[i]);
            if (num > 50)
                printf("...)\n   %d = number of digits in repeating cycle\n\n", num);
            //fprintf(fp,"...)\n   %d = number of digits in repeating cycle\n\n", num);
            else
                printf(")\n   %d = number of digits in repeating cycle\n\n", num);
                //fprintf(fp,")\n   %d = number of digits in repeating cycle\n\n", num);
        }
    }
//  fclose(fp);
    return 0;
}

Uva10340子序列

#include<cstdio>
#include<iostream>
#include<string>
using namespace std;

int main() {
    string s1, s2;
    while (cin >> s1 >> s2) {
        string::iterator a, b, c;
        a = s1.begin();
        b = c = s2.begin();
        int num = 0;
        while (a != s1.end()) {
            for (c = b; c != s2.end(); c++) {
                if (*c != *a)
                    continue;
                else {
                    b = ++c;
                    num++;
                    break;
                }
            }
            if (c == s2.end())
                break;
            a++;
        }
        if (num != s1.size())
            printf("No\n");
        else
            printf("Yes\n");
    }
    return 0;
}

Uva227谜题

#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
#include<memory.h>
using namespace std;
char a[6][6];

bool legal(int nx, int ny) {
    return nx >= 0 && nx < 5 && ny >= 0 && ny < 5;
}

void swapnum(int x,int y,int nx, int ny) {
    char c = a[x][y];
    a[x][y] = a[nx][ny];
    a[nx][ny] = c;
    return;
}

int main() {
    int kase = 0;
    //FILE* fp;
    //fp = fopen("stdout.txt", "w");
    while (1) {
        int x, y;
        char tmp;
        tmp = getchar();
        if (tmp == 'Z')
            break;
        if (tmp == ' ') {
            x = 0;
            y = 0;
        }
        a[0][0] = tmp;
        for (int j = 1; j < 5; j++) {
            scanf("%c", &a[0][j]);
        }
        for (int i = 1; i < 5; i++) {
            getchar();
            for (int j = 0; j < 5; j++) {
                scanf("%c", &a[i][j]);
            }
        }
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                if (a[i][j] == ' ')
                    x = i, y = j;
            }
        }
        string cmd;
        char c;
        while (c = getchar()) {
            if (c == '0')
                break;
            if (c == '\n')
                continue;
            else cmd.push_back(c);
        }
        getchar();
        bool flag = true;
        for (string::iterator it = cmd.begin(); it != cmd.end(); it++) {
            if (*it == 'A') {
                int nx = x - 1;
                int ny = y;
                if (legal(nx, ny)) {
                    swapnum(x, y, nx, ny);
                    x = nx;
                    y = ny;
                    continue;
                }
                else {
                    flag = false;
                    break;
                }
            }
            else if (*it == 'B') {
                int nx = x + 1;
                int ny = y;
                if (legal(nx, ny)) {
                    swapnum(x, y, nx, ny);
                    x = nx;
                    y = ny;
                    continue;
                }
                else {
                    flag = false;
                    break;
                }
            }
            else if (*it == 'L') {
                int nx = x;
                int ny = y - 1;
                if (legal(nx, ny)) {
                    swapnum(x, y, nx, ny);
                    x = nx;
                    y = ny;
                    continue;
                }
                else {
                    flag = false;
                    break;
                }
            }
            else {
                int nx = x;
                int ny = y + 1;
                if (legal(nx, ny)) {
                    swapnum(x, y, nx, ny);
                    x = nx;
                    y = ny;
                    continue;
                }
                else {
                    flag = false;
                    break;
                }
            }
        }
        if (kase)
            //fprintf(fp, "\n");
            printf("\n");
        //fprintf(fp,"Puzzle #%d:\n", ++kase);
        printf("Puzzle #%d:\n", ++kase);
        if (flag) {
            for (int i = 0; i < 5; i++) {
                //fprintf(fp, "%c %c %c %c %c\n", a[i][0], a[i][1], a[i][2], a[i][3], a[i][4]);
                printf("%c %c %c %c %c\n", a[i][0], a[i][1], a[i][2], a[i][3], a[i][4]);
            }
        }
        else {
            //fprintf(fp,"This puzzle has no final configuration.\n");
            printf("This puzzle has no final configuration.\n");
        }
        memset(a, ' ', sizeof(a));
        //fprintf(fp, "\n");
    }
    //fclose(fp);
    return 0;
}


Uva1587盒子

#include<cstdio>
#include<iostream>
#include<set>
#include<utility>
using namespace std;
typedef pair<int, int> P;

bool unsame(P p) {
    return p.first != p.second;
}

int main() {
    multiset<P>store;
    set<int>s;
    P tar;
    int num = 0;
    //FILE*fp;
    //fp = fopen("stdout", "w");
    while (scanf("%d%d", &tar.first, &tar.second) != EOF) {
        if (tar.first > tar.second) {
            P mid(tar.second, tar.first);
            store.insert(mid);
        }
        else
            store.insert(tar);
        num++;
        if (num == 6) {
            int kind = 1;
            set<P>::iterator it ,itt,ittt;
            it = itt = ittt = store.begin();
            itt++;
            while (itt != store.end()) {
                if (*it == *itt) {
                    itt++;
                }
                else {
                    kind++;
                    it = itt;
                    itt++;
                }
            }
            bool flag;
            if (kind == 1) {
                flag = true;
            }
            else if (kind == 2) {
                int dis = 0;
                it = itt = ittt = store.begin();
                while (itt != store.end()) {
                    if (*itt == *it) {
                        itt++;
                        continue;
                    }
                    else {
                        if ((unsame(*itt) && unsame(*it)) || ((*it).second != (*itt).first)) {
                            flag = false;
                            break;
                        }
                        else {
                            if (!unsame(*it))
                                dis = 6 - distance(it, itt);
                            else
                                dis = distance(it, itt);
                            if (dis == 3 || dis == 4)
                                flag = true;
                            else
                                flag = false;
                            break;
                        }
                    }
                }
            }
            else if (kind == 3) {
                it = itt = ittt = store.begin();
                do {
                    itt++;
                } while (*it == *itt);
                ittt = itt;
                do {
                    ittt++;
                } while (*itt == *ittt);
                if (distance(it, itt) == 2 && distance(itt, ittt) == 2) {
                    if ((*it).first == (*itt).first && (*it).second == (*ittt).first && (*itt).second == (*ittt).second) 
                        flag = true;
                    else
                        flag = false;
                }
                else
                    flag = false;
            }
            else
                flag = false;
            if (flag)
                printf("POSSIBLE\n");
                //fprintf(fp, "POSSIBLE\n");

            else
                printf("IMPOSSIBLE\n");
                //fprintf(fp, "IMPOSSIBLE\n");
            store.clear();
            num = 0;
        }
    }
    //fclose(fp);
    return 0;
}

琬若1

#include<cstdio>
#include<iostream>
using namespace std;

int main() {
    int tar[1000];
    int n, mid;
    for (int i = 0; i < 20; i++) {
        scanf("%d", &tar[i]);
    }
    for (int i = 0; i < 20; i++) {
        tar[i] ^= 31337;
        mid = tar[i];
        printf("%c%c", mid >> 8, tar[i]);
    }
    return 0;
}

琬若2

#include<cstdio>
#include<iostream>
#include<time.h>
using namespace std;

int main() {
    time_t now;
    now = time(NULL);
    int tsecond = now;
    int tminutes = tsecond / 60;
    int minutes = tminutes % 60;
    int thours = tminutes / 60;
    int hours = thours % 24;
    int tday = thours / 24;
    int day = tday - ((2011 - 1970 + 1) * 365 + 69) - 5 * 365;
    int tyear = tday / 365;
    int year = tday % 365;

    printf("%d ", tyear + 1970);
    if (day <= 30)
        printf("Mrach. %d", day);
    else if(day <= 61)
        printf("April.%d", day-61);
    //这点不想写了;
    else if(day>5*31+4*30)
        printf("Dec.%d ", day - 5 * 31 - 4 * 30);
    printf("%d:%d", (hours + 8) % 24, minutes);
    return 0;
}

Uva1225数数字

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int main() {
    int n, kase = 0;
    scanf("%d", &n);
    string s;
    while (kase++ < n) {
        int last;int tar[10] = {};s.clear();scanf("%d", &last);int mid;for (int i = 1; i <= last; i++) {
            int num = i;while (1) {mid = num % 10;tar[mid]++;if (num / 10 == 0)break;else
                num /= 10;
        }
        }
        for (int i = 0; i < 10; i++) {
            if (i == 9) {
                printf("%d\n", tar[i]);
                break;
            }
            printf("%d ", tar[i]);
        }
    }
    return 0;
}

Uva1586摩尔质量

#include<cstdio>
#include<iostream>
#include<sstream>
#include<map>
#include<utility>
#include<cstring>
using namespace std;

int main() {
    string s;
    int n, kase = 0;
    map<char, int>store;
    scanf("%d", &n);
    while (kase++ < n) {
        store.insert(make_pair('C', 0));
        store.insert(make_pair('H', 0));
        store.insert(make_pair('N', 0));
        store.insert(make_pair('O', 0));
        cin >> s;
        string ss;
        char c;
        string::iterator it = s.begin(), itt = s.begin();
        while (itt != s.end()) {
            if (isalpha(*it)) {
                int num = 0;
                for (itt = it + 1; itt != s.end(); itt++) {
                    if (isdigit(*itt)) {
                        num = num * 10 + (*itt - '0');
                    }
                    else if (itt - it == 1) {
                        num++;
                        break;
                    }
                    else
                        break;
                }
                store[*it] += num;
                if (itt == s.end() && isalpha(*(itt - 1)))
                    store[*it] ++;
                else {

                    it = itt;
                }
            }
        }
        float ans = store['C'] * 12.01 + store['H'] * 1.008 + store['N'] * 14.01 + store['O'] * 16.00;
        printf("%.3f\n", ans);
        store.clear();
    }
    return 0;
}

Uva1158高低档

#include<cstdio>
#include<iostream>
#include<string.h>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
bool flag;
int check(string sl, string ss) {
    int len = 0;
    string::iterator it = sl.begin(), itt = ss.begin();
    while (it != sl.end() && itt != ss.end()) {
        if (*it + *itt <= 'c') {
            it++, itt++;

        }
        else {
            itt = ss.begin();
            it = sl.begin() + len;
            len++;
        }
        if (itt == ss.end()) {
            flag = true;
            break;
        }
    }
    return sl.size() - len + 1;
}

int main() {
    char x1[1000], x2[1000];
    string sl, ss;
//  FILE* fp;
//  fp = fopen("stdout.txt", "w");
    while (cin>>sl>>ss) {
        int len;
        flag = false;
        int len1 = check(sl, ss);
        int len2 = check(ss, sl);
        if (flag)
            printf("%d\n", max(sl.size(), ss.size()));
        else
            printf("%d\n", sl.size() + ss.size() - max(len1, len2));
    }
    //fclose(fp);
    return 0;
}

Uva455周期串

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

int main() {
    string s, none;
    int n, kase = 0;
    scanf("%d", &n);

//  FILE *fp;
//  fp = fopen("stdout.txt", "w");
    //if (fp == NULL)
    //  cout << 000000;
    bool flagg = true;
    while (kase++ < n) {
        //getline(cin, none);
        cin >> s;
        string ss;
        int len = s.size();
        for (int i = 1; i <= s.size(); i++) {
            ss = s.substr(0, i);
            int cnt = 0;
            bool flag = true;
            if (len%i != 0)
                continue;
            else {
                for (int j = 0; j < len; j += i) {
                    if (s.compare(j, i, ss) != 0) {
                        flag = false;
                        break;
                    }
                }
                if (flag) {
                    if (flagg) {
                        //fprintf(fp, "%d\n", i);
                        printf("%d\n", i);
                        flagg = false;
                        break;
                    }
                    else {
                    //  fprintf(fp, "\n%d\n", i);
                        printf("\n%d\n", i);
                        break;
                    }
                    //fprintf(fp,"%d\n\n", i);
                    //printf("%d\n\n", i);
                    //break;
                }
            }
        }
    }
    //fclose(fp);
    return 0;
}

Uva1585最高得分

#include<cstdio>
#include<iostream>
#include<string>
using namespace std;

int main() {
    int t = 0;
    int n;
    scanf("%d", &n);
    while (t++ < n) {
        string s;
        cin >> s;
        int ans = 0, num = 1;
        for (string::iterator it = s.begin(); it != s.end(); it++) {
            if (*it == 'O') {
                ans += num++;
            }
            else {
                num = 1;
                continue;
            }
        }
        cout << ans << endl;
    }
    return 0;
}

Uva11809第三张压轴题

#include<cstdio>
#include<iostream>
#include<string>
using namespace std;

int main() {
    int t = 0;
    int n;
    scanf("%d", &n);
    while (t++ < n) {
        string s;
        cin >> s;
        int ans = 0, num = 1;
        for (string::iterator it = s.begin(); it != s.end(); it++) {
            if (*it == 'O') {
                ans += num++;
            }
            else {
                num = 1;
                continue;
            }
        }
        cout << ans << endl;
    }
    return 0;
}

Uva11882最大的数

#include<cstdio>
#include<iostream>
#include<string.h>
#include<string>
#include<vector>
#include<memory.h>
using namespace std;
char mp[20][20];
int x[30], y[30], g[30][30], cnt, q[40], r, c, vis[30], dis[30];
const int dir[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };
vector<int>node[30];
string ans, cur;

bool legal(int x,int y) {
    return x >= 0 && x < r&&y >= 0 && y < c&&mp[x][y] != '#';
}

int h(int pos) {
    int head = 0, rear = 0, cnt = 0;
    q[rear++] = pos;
    memset(dis, -1, sizeof(dis));
    dis[pos] = 0;
    while (head != rear) {
        int t = q[head++];
        for (int i = 0; i < node[t].size(); i++) {
            if (vis[node[t][i]])
                continue;
            if (dis[node[t][i]] < 0) {
                cnt++;
                q[rear++] = node[t][i];
                dis[node[t][i]] = dis[t] + 1;
            }
        }
    }
    return cnt + 1;
}

void dfs(int pos) {
    int l = h(pos);
    if (l + cur.size() < ans.size())
        return;
    if (l + cur.size() == ans.size()) {
        if (cur + "z" < ans)
            return;
    }
    cur += mp[x[pos]][y[pos]];
    if (l == 1) {
        if (cur.size() > ans.size() || cur.size() == ans.size() && cur > ans)
            ans = cur;
    }
    vis[pos] = 1;
    for (int i = 0; i < node[pos].size(); i++) {
        if (!vis[node[pos][i]])
            dfs(node[pos][i]);
    }
    cur.pop_back();
    vis[pos] = 0;
}

int main() {
    while (scanf("%d %d", &r, &c) == 2 && r) {
        cnt = 0;
        for (int i = 0; i < r; i++) {
            scanf("%s", mp[i]);
            for (int j = 0; j < c; j++) {
                if (mp[i][j] != '#') {
                    x[cnt] = i;
                    y[cnt] = j;
                    g[i][j] = cnt++;
                }
            }
        }
        for (int i = 0; i < cnt; i++)
            node[i].clear();
        for (int i = 0; i < cnt; i++) {
            for (int j = 0; j < 4; j++) {
                int nx = x[i] + dir[j][0];
                int ny = y[i] + dir[j][1];
                if (legal(nx, ny))
                    node[i].push_back(g[nx][ny]);
            }
        }
        cur = ans = "";
        for (int i = 0; i < cnt; i++)
            dfs(i);
        cout << ans << endl;
    }
    return 0;
}

继续努力!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值