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
,就是从第二行左侧滑入棋盘。如果第二行有空的位置,就把空的位置左边的棋子向右移一个,把新下的棋子放到左边第一个的位置。如果没有,则去掉最右的那个棋子,并把剩下棋子整体右移一个,把新下的棋子放在左边第一个的位置。
每一次输入之后,都要一次是否有成行或成列的X
或O
,如果有的话,就比较两种棋子对应的行列数量是否一样。如果不一样,就立刻输出结果,后续输入就不再判断。如果一样,则在后面的输入继续判断。如果遇到终止信号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;
}
}