50分求助《半江瑟瑟半江红,样例全对》

P4327 [COCI2006-2007#1] Okviri

## 错因 ```cpp round(i,0,s.length()) { /*条件1*/if ((i + 1) % 3 == 0) printf("*.%c.*",s[i]);//温蒂框架 /*条件2*/else if (i == 0) printf("#.%c.#",s[i]);//若是开头,有头有尾打印 /*条件3*/else if (i == s.length() - 1 && (i + 2) % 3 == 0) printf("#.%c.#",s[i]);//如果是最后一个,且前一个和本身都不是温蒂,有头有尾打印 /*条件4*/else if (!((i + 2) % 3 == 0)) printf(".%c.#",s[i]);//如果下一个字母不是温蒂,无头有尾打印 /*条件5*/else printf(".%c.",s[i]);//否则,既下一个是温蒂框架,且不是开头结尾,无头无尾打印 } ``` 如果输入了$3k+2$个字母,倒数第二个字母会走条件$4$**有尾**输出,而最后一个字母**有头**有尾输出,导致重复,并WA ------------ ------------ ## 错误数据 输入: ABCDE 错误输出: ``` ..#...#...*...#...#.. .#.#.#.#.*.*.#.#.#.#. #.A.#.B.*.C.*.D.##.E.# .#.#.#.#.*.*.#.#.#.#. ..#...#...*...#...#.. ``` ``` D.##.E ``` 连续两个#不对 正确输出: ``` ..#...#...*...#...#.. .#.#.#.#.*.*.#.#.#.#. #.A.#.B.*.C.*.D.#.E.# .#.#.#.#.*.*.#.#.#.#. ..#...#...*...#...#.. ``` --------------- --------- ## 修改 正确思路:开头有头有尾输出,其他时候(包括结尾)温蒂框架有头有尾输出,其他情况下无头有尾输出,除非后头有温蒂框架进行避让。 1.将条件3的```&& (i + 2) % 3 == 0```去掉。 ------ ---- ## AC代码 ```cpp #include <bits/stdc++.h> #define MOD 998244353 #define mod 1000000007 #define ll long long #define ull unsigned long long #define ui unsigned int #define range(i,a,b) for (int i = a; i <= b; i++) #define round(i,a,b) for (int i = a; i < b; i++) #define rrange(i,a,b) for (int i = a; i >= b; i--) #define rround(i,a,b) for (int i = a; i > b; i--) using namespace std; int main() { string s; cin >> s; int i; round(i,0,s.length()) { if ((i + 1) % 3 == 0) cout << ".*.."; else if (i == 0) cout << "..#.."; else cout << ".#.."; } cout << endl; round(i,0,s.length()) { if ((i + 1) % 3 == 0) cout << "*.*."; else if (i == 0) cout << ".#.#."; else cout << "#.#."; } cout << endl; round(i,0,s.length()) { if ((i + 1) % 3 == 0) printf("*.%c.*",s[i]); else if (i == 0) printf("#.%c.#",s[i]); else if (i == s.length() - 1 && (i + 2) % 3 == 0) printf(".%c.#",s[i]); else if (!((i + 2) % 3 == 0)) printf(".%c.#",s[i]); else printf(".%c.",s[i]); } cout << endl; round(i,0,s.length()) { if ((i + 1) % 3 == 0) cout << "*.*."; else if (i == 0) cout << ".#.#."; else cout << "#.#."; } cout << endl; round(i,0,s.length()) { if ((i + 1) % 3 == 0) cout << ".*.."; else if (i == 0) cout << "..#.."; else cout << ".#.."; } return 0; } ```
by wanglexi @ 2023-07-20 22:30:35


@[wanglexi](/user/378403) 蟹蟹大佬!此帖终
by __Harry_Haiyun__ @ 2023-07-21 09:37:01


|