• 220 - Othello (UVA)


    题目链接如下:

    Online Judge

    我最终的代码如下(有个细节,88行输出时,需要%2d;locate函数第三个参数是0的话,代表只是判断是否可以放置;1代表下一步棋,包括替换被夹住的棋子):

    1. #include
    2. #include
    3. // #define debug
    4. const int sz = 10;
    5. int n, sum, xx, yy;
    6. char board[sz][sz];
    7. char op[4];
    8. char curr, other;
    9. int dirX[] = {1, 1, 0, -1, -1, -1, 0, 1};
    10. int dirY[] = {0, 1, 1, 1, 0, -1, -1, -1};
    11. int locate(int u, int v, int k){
    12. if(k == 0 && (board[u][v] == 'W' || board[u][v] == 'B')){
    13. return 0;
    14. }
    15. if(k == 1){
    16. board[u][v] = curr;
    17. }
    18. for(int i = 0; i < 8; ++i){
    19. for(int len = 1; len < 8; ++len){
    20. if(u + len * dirX[i] < 1 || u + len * dirX[i] > 8 || v + len * dirY[i] < 1 || v + len * dirY[i] > 8){
    21. break;
    22. }
    23. if(board[u + len * dirX[i]][v + len * dirY[i]] == curr){
    24. if(len == 1){
    25. break;
    26. }
    27. if(k == 0){
    28. return 1;
    29. }
    30. for(int j = 1; j < len; ++j){
    31. board[u + j * dirX[i]][v + j * dirY[i]] = curr;
    32. }
    33. break;
    34. }
    35. if(board[u + len * dirX[i]][v + len * dirY[i]] == '-'){
    36. break;
    37. }
    38. }
    39. }
    40. return 0;
    41. }
    42. int main(){
    43. #ifdef debug
    44. freopen("0.txt","r",stdin);
    45. freopen("1.txt","w",stdout);
    46. #endif
    47. scanf("%d\n", &n);
    48. for(int kase = 0; kase < n; ++kase){
    49. if(kase){
    50. printf("\n");
    51. }
    52. for(int i = 1; i <= 8; ++i){
    53. scanf("%s", board[i] + 1);
    54. }
    55. scanf("%s", op);
    56. curr = op[0];
    57. other = (curr == 'B' ? 'W' : 'B');
    58. while(scanf("%s", op)){
    59. if(op[0] == 'L'){
    60. sum = 0;
    61. for(int i = 1; i <= 8; ++i){
    62. for(int j = 1; j <= 8; ++j){
    63. if(locate(i, j, 0)){
    64. printf("%s(%d,%d)", sum ? " " : "", i, j);
    65. sum++;
    66. }
    67. }
    68. }
    69. printf("%s", sum ? "\n" : "No legal move.\n");
    70. } else if(op[0] == 'M'){
    71. if(!locate(op[1] - '0', op[2] - '0', 0)){
    72. std::swap(curr, other);
    73. }
    74. locate(op[1] - '0', op[2] - '0', 1);
    75. xx = yy = 0;
    76. for(int i = 1; i <= 8; ++i){
    77. for(int j = 1; j <= 8; ++j){
    78. if(board[i][j] == 'B'){
    79. xx++;
    80. } else if(board[i][j] == 'W'){
    81. yy++;
    82. }
    83. }
    84. }
    85. printf("Black - %2d White - %2d\n", xx, yy);
    86. std::swap(curr, other);
    87. } else{
    88. for(int i = 1; i <= 8; ++i){
    89. printf("%s\n", board[i] + 1);
    90. }
    91. break;
    92. }
    93. }
    94. }
    95. #ifdef debug
    96. fclose(stdin);
    97. fclose(stdout);
    98. #endif
    99. return 0;
    100. }

    一开始把判断能否放置棋子的函数和下一步棋的函数分开来写,代码如下:

    1. #include
    2. #include
    3. // #define debug
    4. const int sz = 10;
    5. int n, sum, xx, yy;
    6. char board[sz][sz];
    7. char op[4];
    8. char curr, other;
    9. int dirX[] = {1, 1, 0, -1, -1, -1, 0, 1};
    10. int dirY[] = {0, 1, 1, 1, 0, -1, -1, -1};
    11. bool canLocate(int u, int v){
    12. if(board[u][v] == 'W' || board[u][v] == 'B'){
    13. return false;
    14. }
    15. for(int i = 0; i < 8; ++i){
    16. for(int len = 1; len < 8; ++len){
    17. if(u + len * dirX[i] < 1 || u + len * dirX[i] > 8 || v + len * dirY[i] < 1 || v + len * dirY[i] > 8){
    18. break;
    19. }
    20. if(board[u + len * dirX[i]][v + len * dirY[i]] == curr){
    21. if(len == 1){
    22. break;
    23. }
    24. return true;
    25. }
    26. if(board[u + len * dirX[i]][v + len * dirY[i]] == '-'){
    27. break;
    28. }
    29. }
    30. }
    31. return false;
    32. }
    33. void locate(int u, int v){
    34. board[u][v] = curr;
    35. for(int i = 0; i < 8; ++i){
    36. for(int len = 1; len < 8; ++len){
    37. if(u + len * dirX[i] < 1 || u + len * dirX[i] > 8 || v + len * dirY[i] < 1 || v + len * dirY[i] > 8){
    38. break;
    39. }
    40. if(board[u + len * dirX[i]][v + len * dirY[i]] == curr){
    41. if(len == 1){
    42. break;
    43. }
    44. for(int j = 1; j < len; ++j){
    45. board[u + j * dirX[i]][v + j * dirY[i]] = curr;
    46. }
    47. break;
    48. }
    49. if(board[u + len * dirX[i]][v + len * dirY[i]] == '-'){
    50. break;
    51. }
    52. }
    53. }
    54. }
    55. int main(){
    56. #ifdef debug
    57. freopen("0.txt","r",stdin);
    58. freopen("1.txt","w",stdout);
    59. #endif
    60. scanf("%d\n", &n);
    61. for(int kase = 0; kase < n; ++kase){
    62. if(kase){
    63. printf("\n");
    64. }
    65. for(int i = 1; i <= 8; ++i){
    66. scanf("%s", board[i] + 1);
    67. }
    68. scanf("%s", op);
    69. curr = op[0];
    70. other = (curr == 'B' ? 'W' : 'B');
    71. while(scanf("%s", op)){
    72. if(op[0] == 'L'){
    73. sum = 0;
    74. for(int i = 1; i <= 8; ++i){
    75. for(int j = 1; j <= 8; ++j){
    76. if(canLocate(i, j)){
    77. printf("%s(%d,%d)", sum ? " " : "", i, j);
    78. sum++;
    79. }
    80. }
    81. }
    82. printf("%s", sum ? "\n" : "No legal move.\n");
    83. } else if(op[0] == 'M'){
    84. if(!canLocate(op[1] - '0', op[2] - '0')){
    85. std::swap(curr, other);
    86. }
    87. locate(op[1] - '0', op[2] - '0');
    88. xx = yy = 0;
    89. for(int i = 1; i <= 8; ++i){
    90. for(int j = 1; j <= 8; ++j){
    91. if(board[i][j] == 'B'){
    92. xx++;
    93. } else if(board[i][j] == 'W'){
    94. yy++;
    95. }
    96. }
    97. }
    98. printf("Black - %2d White - %2d\n", xx, yy);
    99. std::swap(curr, other);
    100. } else{
    101. for(int i = 1; i <= 8; ++i){
    102. printf("%s\n", board[i] + 1);
    103. }
    104. break;
    105. }
    106. }
    107. }
    108. #ifdef debug
    109. fclose(stdin);
    110. fclose(stdout);
    111. #endif
    112. return 0;
    113. }

  • 相关阅读:
    PDF转Markdown的开源工具解析
    [架构之路-225]:计算机硬件与体系结构 - 分类方法大汇总: RISC, CISC
    数据分析学习及实用技巧 —— LF《数据分析集训营》
    【 C++ 】函数模板进阶
    人工智能轨道交通行业周刊-第21期(2022.10.31-11.6)
    【云开发】小程序端操作数据库详解
    你还不会写API文档吗
    clion配置cygwin必按包
    魔众题库系统 v8.8.0 公式编辑升级,注册站内信和邮件,手机Banner支持视频背景
    相对路径(下级,同级)
  • 原文地址:https://blog.csdn.net/linh2006/article/details/133353132