Life of xhu

About

HOJ_1536 & HOJ_1550

Apr 29, 2014

  |   #HOJ

1536:简单的字符代换,用map存好字符间的对应关系,然后处理输入字符串并输出即可。

代码如下:

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

int main(){
    map<char, char> pair;
    string src, des, input;
    getline(cin, src);
    getline(cin, des);
    for(int i = 0; i < src.length(); i++)
        pair[src[i]] = des[i];
    cout << des << endl;
    cout << src << endl;
    while(getline(cin, input)){
        for(int i = 0; i < input.length(); i++){
            if(pair[input[i]] != NULL)
                cout << pair[input[i]];
            else
                cout << input[i];
        }
        cout << endl;
    }
}  

1550:题目的意思是模拟棋盘,输入的字符串表示落子的位置。比如L2,就是从第二行左侧滑入棋盘。如果第二行有空的位置,就把空的位置左边的棋子向右移一个,把新下的棋子放到左边第一个的位置。如果没有,则去掉最右的那个棋子,并把剩下棋子整体右移一个,把新下的棋子放在左边第一个的位置。

每一次输入之后,都要一次是否有成行或成列的XO,如果有的话,就比较两种棋子对应的行列数量是否一样。如果不一样,就立刻输出结果,后续输入就不再判断。如果一样,则在后面的输入继续判断。如果遇到终止信号QUIT时仍然没有分出胜负,则输出TIE GAME

这道题难点就在输入字符串之后棋子的摆放上,用数组处理好之后,判断胜负就很简单了。

代码如下:

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

int getNum(string s){
    switch(s.length()){
        case 2:
            return s[1] - '0';
            break;
        case 3:
            return (s[1] - '0') * 10 + s[2] - '0';
            break;
        case 4:
            return (s[1] - '0') * 100 + (s[2] - '0') * 10 + s[3] - '0';
            break;
    }
}

int main(){
    int N, len, num, count, loc;
    bool flag, tmp;
    char board[110][110];
    string input;
    map<char, int>score;
    while(scanf("%d", &N) != EOF){
        for(int i = 0; i < 110; i++){
            for(int j = 0; j < 110; j++)
                board[i][j] = ' ';
        }
        flag = false;
        count = 0;
        while(cin >> input && input != "QUIT"){
            num = getNum(input);
            score['X'] = score['O'] = 0;
            switch(input[0]){
                case 'T':
                    if(board[1][num] == ' ')
                        board[1][num] = count % 2 == 0 ? 'X' : 'O';
                    else{
                        for(int i = 2; i < 110; i++){
                            if(i == N + 1){
                                loc = N;
                                break;
                            }else if(board[i][num] == ' '){
                                loc = i;
                                break;
                            }
                        }
                        for(int i = loc; i >= 2; i--)
                            board[i][num] = board[i - 1][num];
                        board[1][num] = count % 2 == 0 ? 'X' : 'O';
                    }
                    break;
                case 'B':
                    if(board[N][num] == ' ')
                        board[N][num] = count % 2 == 0 ? 'X' : 'O';
                    else{
                        for(int i = N; i >= 0; i--){
                            if(i == 0){
                                loc = 1;
                                break;
                            }else if(board[i][num] == ' '){
                                loc = i;
                                break;
                            }
                        }
                        for(int i = loc; i <= N; i++)
                            board[i][num] = board[i + 1][num];
                        board[N][num] = count % 2 == 0 ? 'X' : 'O';
                    }
                    break;
                case 'L':
                    if(board[num][1] == ' ')
                        board[num][1] = count % 2 == 0 ? 'X' : 'O';
                    else{
                        for(int i = 2; i < 110; i++){
                            if(i == N + 1){
                                loc = N;
                                break;
                            }else if(board[num][i] == ' '){
                                loc = i;
                                break;
                            }
                        }
                        for(int i = loc; i >= 2; i--)
                            board[num][i] = board[num][i - 1];
                        board[num][1] = count % 2 == 0 ? 'X' : 'O';
                    }
                    break;
                case 'R':
                    if(board[num][N] == ' ')
                        board[num][N] = count % 2 == 0 ? 'X' : 'O';
                    else{
                        for(int i = N; i >= 0; i--){
                            if(i == 0){
                                loc = 1;
                                break;
                            }else if(board[num][i] == ' '){
                                loc = i;
                                break;
                            }
                        }
                        for(int i = loc; i <= N - 1; i++)
                            board[num][i] = board[num][i + 1];
                        board[num][N] = count % 2 == 0 ? 'X' : 'O';
                    }
                    break;
                default:
                    break;
            }
            /*   打印出当前棋盘的棋子分布情况
            for(int i = 1; i <= N; i++){
                for(int j = 1; j <= N; j++){
                    if(board[i][j] == ' ')
                        cout << '-' << ' ';
                    else
                        cout << board[i][j] << ' ';
                }
                cout << endl;
            }
            */
            if(!flag){
                for(int i = 1; i <= N; i++){
                    tmp = true;
                    for(int j = 2; j <= N; j++){
                        if(board[i][j] != board[i][j - 1])
                            tmp = false;
                    }
                    score[board[i][N]] += tmp ? 1 : 0;
                }
                for(int i = 1; i <= N; i++){
                    tmp = true;
                    for(int j = 2; j <= N; j++){
                        if(board[j][i] != board[j - 1][i])
                            tmp = false;
                    }
                    score[board[N][i]] += tmp ? 1 : 0;
                }
                if(score['X'] != score['O']){
                    flag = true;
                    if(score['X'] > score['O'])
                        cout << "X WINS" << endl;
                    else
                        cout << "O WINS" << endl;
                }
            }
            count++;
        }
        if(!flag)
            cout << "TIE GAME" << endl;
    }
}