CSP 201604 T1-T4题解
T1 折点计数
#include <iostream>
using namespace std;
int n,a[1005];
int ans;
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
if(n>2)
{
for(int i=2;i<n;i++)
{
ans+=(a[i]>a[i-1])^(a[i-1]>a[i-2]);
}
}
cout<<ans<<endl;
return 0;
}
T2 俄罗斯方块
#include <iostream>
using namespace std;
int map[15][10];
int blk[4][4];
int offsetj;
bool check(int offseti)
{
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
{
int mapi=i+offseti,mapj=j+offsetj-1;
if(blk[i][j]&&(map[mapi][mapj]||mapi>=15))
return false;
}
return true;
}
int main()
{
for(int i=0;i<15;i++)
for(int j=0;j<10;j++)
cin>>map[i][j];
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
cin>>blk[i][j];
cin>>offsetj;
int final_offseti=0;
for(int offseti=0;offseti<20;offseti++)
{
if(!check(offseti))
{
final_offseti=offseti-1;
break;
}
}
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
{
int mapi=i+final_offseti,mapj=j+offsetj-1;
if(blk[i][j])
map[mapi][mapj]=1;
}
for(int i=0;i<15;i++)
{
for(int j=0;j<10;j++)
cout<<map[i][j]<<' ';
cout<<endl;
}
return 0;
}
T3 路径解析
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
int p;
string home;
string dirs[15];
string joinSlash(string str)
{
string ans=str.substr(0,1);
char prev=str[0];
for(int i=1;i<str.length();i++)
{
if(str[i]=='/'&&prev=='/') continue;
ans+=str[i];
prev=str[i];
}
return ans;
}
vector<string> splitSlash(string str)
{
vector<string> parts;
string part;
for(int i=1;i<str.length();i++)
{
if(str[i]=='/') parts.push_back(part),part="";
else part+=str[i];
}
return parts;
}
string parseDots(string str)
{
string ans;
vector<string> str_parts=splitSlash(str);
stack<string> ans_parts;
for(auto part:str_parts)
{
if(part==".") continue;
else if(part==".."&&!ans_parts.empty())ans_parts.pop();
else if(part=="..") continue;
else ans_parts.push(part);
}
while(!ans_parts.empty())
{
string part=ans_parts.top();
ans_parts.pop();
ans="/"+part+ans;
}
return ans.length()?ans:"/";
}
int main()
{
cin>>p>>home;
getchar();
home=joinSlash(home+"/");
for(int i=0;i<p;i++)
{
getline(cin,dirs[i]);
}
for(int i=0;i<p;i++)
{
if(!dirs[i].length())
{
cout<<parseDots(joinSlash(home))<<endl;
continue;
}
string str=joinSlash(dirs[i]+"/");
bool isAbsPath=(str[0]=='/');
if(!isAbsPath) str=home+str;
str=parseDots(str);
cout<<str<<endl;
}
return 0;
}
T4 游戏
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int n,m,t;
int dir[5]={0,1,0,-1,0};
int safe[105][105][2];
inline bool isSafe(int i,int j,int step)
{
return
safe[i][j][0]==safe[i][j][1]&&safe[i][j][0]==0||
!(safe[i][j][0]<=step&&step<=safe[i][j][1]);
}
struct POS{
int i,j,step;
};
queue<POS> q;
int max_step;
int visit[105][105];
int main()
{
cin>>n>>m>>t;
for(int i=0;i<t;i++)
{
int r,c,a,b;
cin>>r>>c>>a>>b;
safe[r-1][c-1][0]=a,safe[r-1][c-1][1]=b;
}
q.push((POS){0,0,0});
while(!q.empty())
{
POS cur=q.front();
q.pop();
if(cur.i==n-1&&cur.j==m-1)
{
cout<<cur.step<<endl;
break;
}
if(max_step!=cur.step)
{
max_step=cur.step;
memset(visit,0,sizeof(visit));
}
for(int i=0;i<4;i++)
{
int di=dir[i],dj=dir[i+1];
int new_i=cur.i+di,new_j=cur.j+dj;
if(0<=new_i&&new_i<n&&0<=new_j&&new_j<m)
{
if(!visit[new_i][new_j]&&isSafe(new_i,new_j,cur.step+1))
{
visit[new_i][new_j]=1;
q.push((POS){new_i,new_j,cur.step+1});
}
}
}
}
return 0;
}