第十三次CCF計算機軟體能力認證CSP題解
阿新 • • 發佈:2018-12-11
/* csp13-1 跳一跳 2017/04/02 by Tawn */ #include <bits/stdc++.h> using namespace std; const int maxn = 100; int main() { int i; int j = 0; int s = 0; while(cin >> i && i) { if(i == 1) {s += 1; j = 0;} if(i == 2) {s += j+2; j += 2;} } cout << s << endl; return 0; }
/* csp13-2 碰撞的小球 2017/04/02 by Tawn */ #include <bits/stdc++.h> using namespace std; const int maxn = 100; int n, L , t; int pos[maxn]; int ori[maxn]; int main() { cin >> n >> L >> t; for(int i = 1; i <= n; i++) { cin >> pos[i]; ori[i] = 1; } while(t--) { for(int i = 1; i <= n; i++) { if(pos[i] == 0 || pos[i] == L) ori[i] = -ori[i]; pos[i] += ori[i]; } for(int i = 1; i <= n; i++) for(int j = i+1; j <= n; j++) { if(pos[i] == pos[j]) { ori[i] = -ori[i]; ori[j] = -ori[j]; } } } for(int i = 1; i <= n; i++) { cout << pos[i]; if(i < n) cout << " "; else cout << endl; } return 0; }
模擬大法好,參考了一下大佬的程式碼,理解能力很重要!
#include <bits/stdc++.h> using namespace std; #define pb(x) push_back(x) #define sc(x) scanf("%d",&x); #define pf(x) printf("%d",x); #define pfn printf("\n"); vector <string>rule; map<string,string> mp; int n,m; bool ismap(string &r,string &url) { vector<string> res; int ir = 0; int iu = 0; while(true) { if(iu >= url.size()) break; if(r[ir] == url[iu]) {iu ++,ir++;} else if(r[ir] == '<') { ir ++; string s; switch(r[ir]) { case 'p': cout << mp[r] ; for(int i = 0; i < res.size(); i++) cout << " " << res[i]; cout << " " << url.substr(iu) << endl; return true; case 'i': while(iu < url.size() && isdigit(url[iu])) s += url[iu++]; if(s.empty()) return false; if(!(s.size() == 1 && s[0] == '0')) s = s.substr(s.find_first_not_of('0')); //cout << "* " << s << " *" << endl; res.pb(s); ir += 4; break; case 's': while(iu < url.size() && (isdigit(url[iu]) || isalpha(url[iu]))) s += url[iu++]; if(s.empty()) return false; res.pb(s); ir += 4; break; default : break; } } else return false; } if(ir >= r.size()) { cout << mp[r]; for(int i = 0; i < res.size(); i++) cout << " " << res[i]; cout << endl; return true; } return false; } void solve(string &url) { for(int i = 0; i < n; i++) { if(ismap(rule[i],url)) return; } printf("404\n"); return ; } int main() { scanf("%d%d",&n,&m); for(int i = 0; i < n; i++) { string str1,str2; cin >> str1 >> str2; rule.pb(str1); mp[str1] = str2; } for(int i = 0; i < m; i++) { string url; cin >> url; solve(url); } return 0; }
/*
csp13-4 棋力評估
2018/05/05
by Tawn
*/
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000;
const int INF = 0x3f3f3f3f;
map <string,int> cnt;
int check(int a[10])
{
if(a[1] != 0 && a[1] == a[2] && a[2] == a[3]) return a[1];
if(a[4] != 0 && a[4] == a[5] && a[5] == a[6]) return a[4];
if(a[7] != 0 && a[7] == a[8] && a[8] == a[9]) return a[7];
if(a[1] != 0 && a[1] == a[4] && a[4] == a[7]) return a[1];
if(a[2] != 0 && a[2] == a[5] && a[5] == a[8]) return a[2];
if(a[3] != 0 && a[3] == a[6] && a[6] == a[9]) return a[3];
if(a[1] != 0 && a[1] == a[5] && a[5] == a[9]) return a[1];
if(a[3] != 0 && a[3] == a[5] && a[5] == a[7]) return a[5];
for(int i = 1; i <= 9; i++)
if(!a[i]) return 0;
return -1;
}
int dfs(int a[10], int t)
{
string s;
int ans;
int num = 1;
for(int i = 1; i <= 9; i++)
{
s += a[i] + '0';
if(!a[i]) num++;
}
if(cnt.count(s) == 1) return cnt[s];
int res = check(a);
if(res == -1) {cnt[s] = 0; return 0;}
if(res == 1) {cnt[s] = num;return num;}
if(res == 2) {cnt[s] = -1*num; return -1*num;}
if(t == 1) ans = -1*INF;
else ans = INF;
for(int i = 1; i <= 9; i++)
{
if(a[i]) continue;
a[i] = t;
if(t == 1)
{
int ans1 = dfs(a,2);
ans = max(ans,ans1);
}
else
{
int ans1 = dfs(a,1);
ans = min(ans,ans1);
}
a[i] = 0;
}
return ans;
}
int main()
{
int a[10];
int T;
cin >> T;
while(T--)
{
for(int i = 1; i <= 9; i++) cin >> a[i];
int ans = dfs(a,1);
cout << ans << endl;
}
}