• 509 - RAID! (UVA)


    题目链接如下:

    Online Judge

    起先写的代码比较复杂,后来参考这位大神【UVA 509 --- RAID!】模拟+位运算_uva509-CSDN博客 的代码修改了思路,代码如下:

    (这里关键点就是,parity block和data block其实可以一致处理,不需要区分。)

    1. #include
    2. #include
    3. #include
    4. // #define debug
    5. int d, s, b, kase = 0;
    6. char op[5];
    7. char data[6][100][64];
    8. char line[6410];
    9. bool flag;
    10. int main(){
    11. #ifdef debug
    12. freopen("0.txt", "r", stdin);
    13. freopen("1.txt", "w", stdout);
    14. #endif
    15. while(scanf("%d", &d) == 1 && d){
    16. scanf("%d %d %s", &s, &b, op);
    17. flag = true;
    18. for(int i = 0; i < d; ++i){
    19. scanf("%s", line);
    20. for(int j = 0; j < b; ++j){
    21. for(int k = 0; k < s; ++k){
    22. data[i][j][k] = line[j * s + k];
    23. }
    24. }
    25. }
    26. for(int j = 0; j < b; ++j){
    27. for(int k = 0; k < s; ++k){
    28. int ix = -1;
    29. int x = 0;
    30. for(int i = 0; i < d; ++i){
    31. if(data[i][j][k] == 'x'){
    32. if(ix != -1){
    33. k = s;
    34. j = b;
    35. flag = false;
    36. break;
    37. }
    38. ix = i;
    39. } else{
    40. x ^= data[i][j][k] - '0';
    41. }
    42. }
    43. if(ix == -1){
    44. if((op[0] == 'E' ? 0 : 1) != x){
    45. flag = false;
    46. k = s;
    47. j = b;
    48. break;
    49. }
    50. } else{
    51. data[ix][j][k] = (op[0] == 'E' ^ x) ? '0' : '1';
    52. }
    53. }
    54. }
    55. if(!flag){
    56. printf("Disk set %d is invalid.\n", ++kase);
    57. continue;
    58. }
    59. std::string str;
    60. for(int j = 0; j < b; ++j){
    61. for(int i = 0; i < d; ++i){
    62. for(int k = 0; k < s; ++k){
    63. if(i != j % d){
    64. str.push_back(data[i][j][k]);
    65. }
    66. }
    67. }
    68. }
    69. while(str.size() % 4){
    70. str.push_back('0');
    71. }
    72. printf("Disk set %d is valid, contents are: ", ++kase);
    73. for(int i = 0; i < str.size() / 4; ++i){
    74. int tmp = ((str[4 * i] - '0') << 3) + ((str[4 * i + 1] - '0') << 2) + ((str[4 * i + 2] - '0') << 1) + str[4 * i + 3] - '0';
    75. printf("%X", tmp);
    76. }
    77. printf("\n");
    78. }
    79. #ifdef debug
    80. fclose(stdin);
    81. fclose(stdout);
    82. #endif
    83. return 0;
    84. }

    原先的代码如下(也能AC,但思路比较繁琐):

    1. #include
    2. #include
    3. #include
    4. // #define debug
    5. int d, s, b, cnt, pivot, kase = 0;
    6. char op[5];
    7. char data[6][100][64];
    8. char line[6410];
    9. int missing[6410];
    10. bool flag;
    11. char table[] = "0123456789ABCDEF";
    12. int main(){
    13. #ifdef debug
    14. freopen("0.txt", "r", stdin);
    15. freopen("1.txt", "w", stdout);
    16. #endif
    17. while(scanf("%d", &d) == 1 && d){
    18. scanf("%d %d %s", &s, &b, op);
    19. std::fill(missing, missing + s * b, 0);
    20. flag = true;
    21. for(int i = 0; i < d; ++i){
    22. scanf("%s", line);
    23. for(int j = 0; j < b; ++j){
    24. for(int k = 0; k < s; ++k){
    25. data[i][j][k] = line[j * s + k];
    26. if(line[j * s + k] == 'x'){
    27. missing[j * s + k]++;
    28. if(flag && missing[j * s + k] > 1){
    29. flag = false;
    30. }
    31. }
    32. }
    33. }
    34. }
    35. if(!flag){
    36. printf("Disk set %d is invalid.\n", ++kase);
    37. continue;
    38. }
    39. for(int j = 0; j < b; ++j){
    40. for(int k = 0; k < s; ++k){
    41. cnt = 0;
    42. for(int i = 0; i < d; ++i){
    43. if(i == j % d){
    44. continue;
    45. }
    46. if(data[i][j][k] == '1'){
    47. cnt++;
    48. } else if(data[i][j][k] == 'x'){
    49. pivot = i;
    50. }
    51. }
    52. cnt %= 2;
    53. if(missing[j * s + k] == 0 || data[j % d][j][k] == 'x'){
    54. if((op[0] == 'E' && cnt) || (op[0] == 'O' && !cnt)){
    55. if(data[j % d][j][k] == 'x'){
    56. data[j % d][j][k] = '1';
    57. } else if(data[j % d][j][k] == '0'){
    58. flag = false;
    59. j = b;
    60. break;
    61. }
    62. } else{
    63. if(data[j % d][j][k] == 'x'){
    64. data[j % d][j][k] = '0';
    65. } else if(data[j % d][j][k] == '1'){
    66. flag = false;
    67. j = b;
    68. break;
    69. }
    70. }
    71. } else{
    72. if((op[0] == 'E' && !cnt && data[j % d][j][k] == '0') || (op[0] == 'E' && cnt && data[j % d][j][k] == '1')
    73. || (op[0] == 'O' && !cnt && data[j % d][j][k] == '1') || (op[0] == 'O' && cnt && data[j % d][j][k] == '0')){
    74. data[pivot][j][k] = '0';
    75. } else{
    76. data[pivot][j][k] = '1';
    77. }
    78. }
    79. }
    80. }
    81. if(!flag){
    82. printf("Disk set %d is invalid.\n", ++kase);
    83. continue;
    84. }
    85. printf("Disk set %d is valid, contents are: ", ++kase);
    86. std::string str;
    87. for(int j = 0; j < b; ++j){
    88. for(int i = 0; i < d; ++i){
    89. for(int k = 0; k < s; ++k){
    90. if(i != j % d){
    91. str.push_back(data[i][j][k]);
    92. }
    93. }
    94. }
    95. }
    96. while(str.size() % 4){
    97. str.push_back('0');
    98. }
    99. for(int i = 0; i < str.size() / 4; ++i){
    100. int tmp = 8 * (str[4 * i] - '0') + 4 * (str[4 * i + 1] - '0') + 2 * (str[4 * i + 2] - '0') + str[4 * i + 3] - '0';
    101. printf("%c", table[tmp]);
    102. }
    103. printf("\n");
    104. }
    105. #ifdef debug
    106. fclose(stdin);
    107. fclose(stdout);
    108. #endif
    109. return 0;
    110. }

  • 相关阅读:
    事件总线EventBus
    旷视科技-python开发,python数据清理和数据清洗面试题【杭州多测师_王sir】【杭州多测师】...
    在海外如何制定有效的应用商店本地化策略
    [WPF]使用HLSL实现百叶窗动效
    安装MyBatis教程
    Pytorch学习——梯度下降和反向传播 03 未完
    YOLO改进系列之注意力机制(GAM Attention模型介绍)
    C语言的核心和灵魂
    从 VLAN 到 IPVLAN: 聊聊虚拟网络设备及其在云原生中的应用
    vue.js实现自定义tab滑动切换效果
  • 原文地址:https://blog.csdn.net/linh2006/article/details/133700803