目錄
1 多項式輸出
2.蛇形方陣
3.字符串的展開
模擬,顧名思義,就是題?讓你做什么你就做什么,考察的是將思路轉化成代碼的代碼能?。這類題?般較為簡單,屬于競賽??的簽到題(但是,萬事?絕對,也有可能會出現讓人非常難受的模擬題),但是在學習語法階段接觸的題,大多數都屬于模擬題。
1 多項式輸出
題?來源: 洛?
題?鏈接:P1067 [NOIP2009 普及組] 多項式輸出
難度系數: ★
[解法]
根據題意模擬+分類討論(分的越詳細,越不會出現bug):
僅需按照順序,考慮每?項的三件事情:符號 + 系數 + 次數。?
處理「符號」:
- 負數:直接輸出
- 正數:(1) 是第n項,不輸出+?(2)其余情況,直接輸出+
處理「系數」:
- 先取絕對值:
? ? ? ? ? ? ? ? (1)不是1,直接輸出
? ? ? ? ? ? ? ? (2)是1
? ? ? ? ? ? ? ? ? ? ? ? 末項 - 需要輸出
? ? ? ? ? ? ? ? ? ? ? ? 不是末項 - 不需要輸出
處理「次數」:
- 次數為?1 ,輸出 "x";
次數為0?,什么也不輸出
其他 ,輸出 "x^" + 對應的次數;
【參考代碼】
#include<iostream>
#include<cmath>
using namespace std;int main(){int n;cin >> n;//循環次數 for(int i = n;i >= 0;i--){int op;cin >> op;if(op == 0) continue;//出來系數為0的情況 //1.符號 if(op < 0) cout << "-";else{if(i != n) cout << "+";} //2.系數int a = abs(op);if(a != 1 || (a==1 && i== 0)) cout << a;//3.次數if(i == 1)cout << "x";else if(i == 0) ;else{cout << "x^" << i;} }return 0;
}
2.蛇形方陣
題?來源: 洛?
題?鏈接:P5731 【深基5.習6】蛇形?陣
難度系數: ★
[解法]
模擬填數的過程。(實現的方式有很多種)
在?個矩陣中按照?定規律填數的通用解法:
- 定義方向向量
? ? ? ? ? ? ?比如本題?共四個方向,分別是右、下、左、上,對應: (0, 1)、(1, 0)、(0, -1)、(-1, 0)
? ? ? ? ? ?
? ? ? ? ? ? 遇到其他類型的題只需要更改方向向量即可;
?????2.根據規則結合方向向量填數
? ? ? ? ? ? (1) 朝?個方向?,?邊走?邊填數,直到越界;
? ? ? ? ? ? (2) 越界之后,結合定義的方向向量,求出下?輪應該?的方向以及應該到達的正確
????????????????????????位置;
? ? ? ? ? ? (3)重復上述過程,直到把所有的數填完為止;
【參考代碼】
#include<iostream>
using namespace std;const int N = 15;//定義方向向量 右,下, 左,上
int dy[] = {1,0,-1,0};
int dx[] = {0,1,0,-1};int arr[N][N];int main(){int n;cin >> n;//模擬填數過程 int cet = 1; //當前位置要填的數 int x = 1,y = 1;//初始位置 int pos = 0;//當前的方向 while(cet <= n*n){arr[x][y] = cet;//計算下一個位置 int a = x + dx[pos];int b = y + dy[pos];//判斷是否越界 if(a < 1 || a > n || b < 1 || b > n || arr[a][b]){//更新出正確的該走的位置 pos = (pos + 1) % 4;a = x + dx[pos];b = y + dy[pos];}cet++;x = a;y = b;} for(int i = 1;i <= n;i++){for(int j = 1;j <= n;j++){printf("%3d",arr[i][j]);}printf("\n");}return 0;
}
3.字符串的展開
題?來源: 洛谷
題?鏈接: P1098 [NOIP2007 提?組] 字符串的展開
難度系數: ★
【解法】
純代碼題 - 考察代碼能力 :>
【參考代碼】
#include<iostream>
#include<algorithm>
using namespace std;int p1,p2,p3,n;
string s,ret;//判斷是否是數字字符
bool isdig(char ch){return ch >= '0' && ch <= '9';;
}//判斷是否小寫字母
bool islet(char ch){return ch >= 'a' && ch <= 'z';
}//展開 把(left,right)之間的字符展開
void add(char l,char r){string t;//遍歷中間的字符for(char ch = l + 1;ch < r;ch++){char tmp = ch;//處理p1 if(p1 == 2 && islet(tmp)) tmp -= 32; //小寫變大寫 else if(p1 == 3) tmp = '*';//變成星號 //處理p2 for(int i = 1;i <= p2;i++){t += tmp;}}//處理p3 if(p3 == 2) reverse(t.begin(),t.end());ret += t;
}
int main(){cin >> p1 >> p2 >> p3 >> s;n = s.size();for(int i = 0;i < n;i++){char ch = s[i];if(s[i] != '-' || i == 0 || i == n-1) ret += ch;else{char left = s[i-1], right = s[i+1];//判斷是否展開 if((isdig(left) && isdig(right) && left < right) || (islet(left) && islet(right) && left < right)){//展開add(left,right); }else{ret += ch; }}}cout << ret << endl;return 0;
}