A.壶中的大银河c++
题意:输入长为n的字符串,B为男孩,G为女孩,求字符串中所含女孩子的个数app
思路:ide
#include <bits/stdc++.h> using namespace std; const int maxn = 1e5+5; char s[maxn]; int main(){ int n,num=0; scanf("%d",&n); scanf("%s",s); int len = strlen(s); for(int i=0;i<len;i++){ if(s[i]=='G') num++; } printf("%d\n",num); }
题意:给一张 n x m 的图(地图边界为墙),其中'o' 表明事物,'@'表明蛇头位置. 如今给出 长度小于 1e5 的操做,表示蛇要走的下一步,操做类型有 'W' 'A' 'S' 'D' 分别表示上下左右。注意:其中蛇头能够碰到蛇尾,若是重复,则输出蛇头符号'@'code
蛇尾符号用'X' 输出.blog
思路:(1)模拟:开一个结构题存放蛇的全部部分,包括身体,头部.若是下一个位置有食物,则新增长头,以后的位置更新节点坐标。而后最后正着输出 (而后就TLE了)ci
(2)上面那种方法实在太蠢,由于这里蛇头和蛇身能够重叠,因此没必要要记录全部信息。首先是移动,在移动过程当中每遇到一个'o'则蛇身的长度加一,最后走完能获得蛇的长度,在移动过程当中判断蛇头是否超出边界,若是则GG。最后,按照蛇身的长度字符串
对操做取逆向移动,而后输出身体‘X’.get
#include <bits/stdc++.h> using namespace std; const int maxn = 450; string mapp[maxn]; int n,m; int headx,heady; int dis[4][2] = {-1,0,0,-1,1,0,0,1}; int mov(char op){ if(op=='W') return 0; if(op=='A') return 1; if(op=='S') return 2; if(op=='D') return 3; } int bac(char op){ if(op=='W') return 2; if(op=='A') return 3; if(op=='S') return 0; if(op=='D') return 1; } int main(){ cin>>n>>m; for(int i=0;i<n;i++){ cin>>mapp[i]; } int len = 0;//蛇身的长度 for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(mapp[i][j]=='@') headx = i,heady = j,mapp[i][j]='.'; } } string op; cin>>op; int flag = 0; for(int i=0;i<(int)op.size();i++){ headx += dis[mov(op[i])][0]; heady += dis[mov(op[i])][1]; if(headx<0||headx>=n||heady<0||heady>=m) {flag = 1; break;} if(mapp[headx][heady]=='o') len++,mapp[headx][heady]= '.'; } if(flag) puts("GG"); else{ int finx = headx,finy = heady;//用于最后有重复头尾部分的覆盖 mapp[finx][finy] = '@'; for(int i=(int)op.size()-1;i>=0;i--){ headx += dis[bac(op[i])][0]; heady += dis[bac(op[i])][1]; if(len<=0) { continue; } if(mapp[headx][heady]!='@') mapp[headx][heady] = 'X'; len--; } for(int i=0;i<n;i++){ cout<<mapp[i]<<endl; } } }