A题
//设四个数组分别表示4个方向,然后根据他是left还是right将下标记录+1或者-1然后Forward的话就是现在的下标记录数组加上这个值。具体的看下代码吧。
#include<stdio.h>
#include<string.h>
int main()
{
int n,a,b,c,l;
char str[10];
scanf("%d",&n);
while(n--)
{
int aa[4]={0,0,0,0};
int a=0,b=0,l,x,y;
scanf("%d",&c);
int i=0;
while(c--)
{
scanf("%s",str);
if(strcmp(str,"LEFT")==0)i=(i+3)%4;
else if(strcmp(str,"RIGHT")==0)i=(i+5)%4;
else if(strcmp(str,"BACK")==0)i=(i+2)%4;
else if(strcmp(str,"FORWORD")==0)
{
scanf("%d",&l);
getchar();
aa[i]+=l;
}
// printf("%d %d %d
",i,aa[i],l);
y=aa[0]-aa[2];
x=aa[1]-aa[3];
}
printf("%d %d
",x,y);
}
}
B题
//将每题的第一滴血放在数组里记录下来,如果这题还没有出现Accepted的话直接放入,或者后面出现的Accepted记录的时间比数组记录的要早,要注意这里的时间可不一定是有序的哦。然后将每题的数组记录打印出来就好了。
#include<stdio.h>
#include<string.h>
int main()
{
int fb[20];
char name[20][20],str[200],time[20][15];
int n,i,num;
char na[20],ans[20],ti[15],c;
scanf("%d",&n);
memset(fb,0,sizeof(fb));
getchar();
while(scanf("%s %s %d %s",&ti,&na,&num,&ans)!=EOF)
{
while(c=getchar(),c!='
');
num-=1000;
if(strcmp(ans,"Accepted")==0)
{
if(fb[num]==0||strcmp(ti,time[num])<0)
{
fb[num]=1;
strcpy(name[num],na);
strcpy(time[num],ti);
}
}
}
for(i=1;i<=n;i++)
{
if(fb[i]==0)
printf("%d
",i+1000);
else
printf("%d %s %s
",i+1000,time[i],name[i]);
}
}
C题
//这题就是题目怎么说你怎么做,纯模拟题。
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
int main(){
__int64 x;
__int64 num[4];
while(~scanf("%I64d",&x)){
__int64 s = x*x;
__int64 ss= s;
//printf("%I64d
",s);
int digit = 0;
while(ss){
ss /= 10;
digit++;
}
//printf("%d
",digit);
if(digit&1) digit++;
if(digit<=4) printf("%I64d
",s);
else {
digit /= 2;
ss = s;
for(int i=0;i<digit-2;i++) ss/=10;
for(int i=0;i<4;i++){
num[i] = ss%10;
ss /= 10;
}
__int64 ans = 0;
for(int i=3,tmp=1000;i>=0;i--,tmp/=10){
ans += num[i]*tmp;
}
printf("%I64d
",ans);
}
}
return 0;
}
D题
//这题我第一遍遍历ISBN码计算取余后的值,当遇到问号就直接跳过,第二次遍历时,如果他是问号就分别用1~10去试之前的值加上这里的值能不能取余到0,如果取余到0就得出答案。
#include<bits/stdc++.h>
using namespace std;
char s[30];
int main(){
while(gets(s)!=0){
int sum = 0;
for(int i = 0;i < 10;i++){
if(s[i]=='?')continue;
int tmp = -1;
if(s[i]=='X')tmp = 10;
else tmp = s[i] - '0';
sum += (10-i)*tmp;
sum %= 11;
}
for(int i = 0;i < 10;i++){
if(s[i]=='?'){
for(int j = 0;j <= 10;j++){
if((sum+(10-i)*j)%11==0){
if(j==10)s[i]='X';
else s[i] = j + '0';
break;
}
}
}
}
puts(s);
}
return 0;
}
E题
//这题先用a[i][j]表示i到j能不能直接到达。如果不能直接达到,那么就通过判断i和j的中点之前有没有访问过,如果有访问过i也能到j。如果这两种方式都到达不了就GG.
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
int a[9][9]={0,1,0,1,1,1,0,1,0,
1,0,1,1,1,1,1,0,1,
0,1,0,1,1,1,0,1,0,
1,1,1,0,1,0,1,1,1,
1,1,1,1,0,1,1,1,1,
1,1,1,0,1,0,1,1,1,
0,1,0,1,1,1,0,1,0,
1,0,1,1,1,1,1,0,1,
0,1,0,1,1,1,0,1,0};
int b[100];
while(t--){
string s;
cin>>s;
bool flag = true;
int len = s.length();
memset(b,0,sizeof(b));
for(int i = 0;i < len-1;i++){
if(a[s[i]-'1'][s[i+1]-'1']==1){
b[s[i]-'1'] = 1;
}else{
if(b[(s[i]+s[i+1]-2*'1')/2]==1){
b[s[i]-'1'] = 1;
}else{
flag = false;break;
}
}
}
flag?puts("Yes"):puts("No");
}
return 0;
}
F题
//两种解法,第一种就像题目写的,先判断是有几个相等,设flag1,如果三个相等为3,如果有两个相等为2,如果三个都不相等为1,比较是如果flag1有一个大于另一个直接比较,否则两者的flag1
都是1比较三个骰子点数相加,为3时比较相同的谁大,如果都是2相对复杂点。
//用权值思想,如果三个都相等三个的权值都是点数*10000,如果两个相等权值为点数*100否则为*1这样就能分开三种类型。
//另外1最大,所以直接1等于7
#include<stdio.h>
int cal(int a,int b,int c){
if(a==b&&b==c){
if(a==1) a=7;
return a*1000;
}
else if((a==b&&a!=c)){
if(a==1) a=7;
if(c==1) c=7;
return a*100+c;
}
else if((a==c&&b!=c)){
if(a==1) a=7;
if(b==1) b=7;
return a*100+b;
}
else if((b==c&&a!=c)){
if(b==1) b=7;
if(a==1) a=7;
return b*100+a;
}
else{
return a+b+c;
}
}
int main(){
int time;
scanf("%d",&time);
while(time--){
int a,b,c;
int x,y,z;
scanf("%d %d %d",&a,&b,&c);
scanf("%d %d %d",&x,&y,&z);
int sum1=cal(a,b,c);
int sum2=cal(x,y,z);
if(sum1>sum2){
puts("Alice");
}
else if(sum2>sum1){
puts("Bob");
}
else{
puts("Draw");
}
}
return 0;
}
//2048游戏很经典了,其实就是模拟这个过程,具体的大家看代码吧,不过解释下思路吧。我先写好一个方向的转换,其他的我先把矩阵转换方向使他在我指定的方向去弄,这样就不用写4个方向的代码。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 4;
int a[4][4];
void translate(){
for(int i = 0;i < maxn;i++){
for(int j = 0;j < maxn;j++){
if(j+1<maxn&&a[i][j]==a[i][j+1]){
a[i][j] *= 2;
a[i][j+1] = 0;
j++;
}
if(j+2<maxn&&a[i][j]==a[i][j+2]&&a[i][j+1]==0){
a[i][j] *= 2;
a[i][j+2] = 0;
j+=2;
}
if(j+3<maxn&&a[i][j]==a[i][j+3]&&a[i][j+1]==0&&a[i][j+2]==0){
a[i][j] *= 2;
a[i][j+3] = 0;
j+=3;
}
}
}
for(int i = 0 ;i < maxn;i++){
int s[maxn];
int cnt = 0;
memset(s,0,sizeof(s));
for(int j = 0;j<maxn;j++)if(a[i][j])s[cnt++]=a[i][j];
for(int j = 0;j<maxn;j++)a[i][j] = s[j];
}
}
int main(){
int T;
scanf("%d",&T);
while(T--){
memset(a,0,sizeof(a));
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
scanf("%d",&a[i][j]);
}
}
char str[10];
scanf("%s",str);
if(str[0]=='D'){
for(int i=0;i<4;i++){
for(int j=0;j<3-i;j++){
swap(a[i][j],a[3-j][3-i]);
}
}
translate();
for(int i=0;i<4;i++){
for(int j=0;j<3-i;j++){
swap(a[i][j],a[3-j][3-i]);
}
}
}
else if(str[0]=='L')translate();
else if(str[0]=='U'){
for(int i=0;i<4;i++){
for(int j=3;j>i;j--){
swap(a[i][j],a[j][i]);
}
}
translate();
for(int i=0;i<4;i++){
for(int j=3;j>i;j--){
swap(a[i][j],a[j][i]);
}
}
}else if(str[0]=='R'){
for(int i=0;i<4;i++){
for(int j=0;j<2;j++){
swap(a[i][j],a[i][3-j]);
}
}
translate();
for(int i=0;i<4;i++){
for(int j=0;j<2;j++){
swap(a[i][j],a[i][3-j]);
}
}
}
for(int i=0;i<4;i++){
for(int j=0;j<3;j++){
printf("%d ",a[i][j]);
}
printf("%d
",a[i][3]);
}
printf("
");
}
return 0;
}
H题
//其实就是第一轮1先走到n,第二轮n再走回1,反正你都要换方向还不如直接走到头更划算。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000;
int a[maxn];
int main(){
int n;
while(~scanf("%d",&n)){
for(int i = 0;i < n;i++)scanf("%d",&a[i]);
int turn = 0;
int complete = 0;
while(complete < n){
if(turn&1){
for(int i = n-1;i >= 0 ;i--){
if(complete >= a[i]){
complete++;
a[i] = 0x3f3f3f3f;
}
}
}else{
for(int i = 0;i < n;i++){
if(complete>= a[i]){
a[i] = 0x3f3f3f3f;
complete++;
}
}
}
turn++;
}
printf("%d
",turn-1);
}
}
I题
//这题...纯模拟吧。不过需要注意的是你转换的那行(列)必须换个数组来存,否则不好处理。
int T,n,m;
const int maxn = 11;
int arr[maxn][maxn];
int init(int n)
{
int num=1;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
arr[i][j]=num++;
}
char s[10];
void solve(int x,int y)
{
int b[10];
switch (s[0])
{
case 'L':
for (int i=0;i<n;i++)
b[i]=arr[x][(i+y)%n];
for (int i=0;i<n;i++)
arr[x][i]=b[i];
break;
case 'R':
for (int i=0;i<n;i++)
b[i]=arr[x][(n+i-y)%n];
for (int i=0;i<n;i++)
arr[x][i]=b[i];
break;
case 'D':
for (int i=0;i<n;i++)
b[i]=arr[(i-y+n)%n][x];
for (int i=0;i<n;i++)
arr[i][x]=b[i];
break;
case 'U':
for (int i=0;i<n;i++)
b[i]=arr[(i+y)%n][x];
for (int i=0;i<n;i++)
arr[i][x]=b[i];
break;
}
}
void print()
{
for(int i=0;i<n-1;i++)
for (int j=0;j<n;j++)
printf("%d ",arr[i][j]);
for (int j=0;j<n-1;j++)
printf("%d ",arr[n-1][j]);
printf("%d
",arr[n-1][n-1]);
}
int main()
{
int x,y;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
init(n);
for(int i=0;i<m;i++)
{
scanf("%s%d%d",s,&x,&y);
solve(x-1,y);
}
print();
}
return 0;
}