喵哈哈村的魔法考试 Round #6 (Div.3) 题解


原题链接: 35~39 http://qscoj.cn/problems/

A.喵哈哈村的代码传说 第一章 冒泡排序

分析:排个序输出

#include "iostream"
#include "cstdio"
#include "algorithm"
#include "cmath"
using namespace std;

int s[100000+10],n;
int main(){
  while(scanf("%d",&n)!=EOF){
    for(int i=0;i<n;i++)  scanf("%d",s+i);
    sort(s,s+n);
    for(int i=0;i<n;i++)  printf("%d ",s[i]);
    printf("\n");
  }
  return 0;
}

B.喵哈哈村的代码传说 第二章 神经网络

分析:异或运算

#include "iostream"
#include "cstdio"
#include "algorithm"
#include "cmath"
using namespace std;

char a[2000],b[2000];
int n,tmp[2000];
int main(){
  while(cin>>n){
    for(int i=0;i<n;i++)  cin>>a[i];
    for(int i=0;i<n;i++)  cin>>b[i];
    for(int i=0;i<n;i++){
      tmp[i] = a[i]==b[i]?0:1;
    }
    for(int i=0;i<n;i++) printf("%d",tmp[i]);
    printf("\n");
  }
  return 0;
}

C.喵哈哈村的代码传说 第三章 宽度优先搜索

分析:广搜模板

#include "iostream"
#include "cstdio"
#include "algorithm"
#include "cmath"
#include "cstring"
#include "queue"
using namespace std;

char Map[200][200];
int Mark[200][200];
int n,m,sx,sy,ex,ey,ans;
struct point{
  int x,y,cnt;
}s,e;
// 顺时针
int dirx[4]={0,0,1,-1};
int diry[4]={1,-1,0,0};
bool bfs(){
  queue<point> q;
  Mark[s.x][s.y]=1;  s.cnt=0;
  q.push(s);
  while(!q.empty()){
    point t = q.front();
    q.pop();
    for(int i=0;i<4;i++){
      point now;
      now.x = t.x+dirx[i];  now.y = t.y+diry[i];
      if(now.x<0 || now.x>=n || now.y<0 || now.y>=m) continue;
      if(Map[now.x][now.y]=='1' && !Mark[now.x][now.y]){
        Mark[now.x][now.y]=1;
        now.cnt = t.cnt+1;
        q.push(now);
        if(now.x==e.x&& now.y==e.y){ printf("%d\n",now.cnt); return true;}
      }
    }
  }
  return false;
}
int main(){
  while(cin>>n>>m>>sx>>sy>>ex>>ey){
    memset(Mark,0,sizeof(Mark));
    for(int i=0;i<n;i++)
      for(int j=0;j<m;j++)
        cin>>Map[i][j];
    s.x=sx-1, s.y=sy-1, s.cnt=0,e.x=ex-1, e.y=ey-1;
    if(!bfs()) cout<<"-1"<<endl;
  }
  return 0;

}

D.喵哈哈村的代码传说 第四章 并查集

分析:并查集模板,蜜汁WA,比赛时怎么交怎么WA,出来就AC...

#include "iostream"
#include "cstdio"
#include "algorithm"
#include "cmath"
using namespace std;

const int max_n = 100000+10;
int par[max_n];
int Rank[max_n];

void init(int n){
  for(int i=0;i<=n;i++) { par[i]=i; Rank[i]=0; }
}
int find(int x){
  if(par[x]==x) return x;
  else {
    return par[x]=find(par[x]);
  }
}
void unite(int x,int y){
  x=find(x);  y=find(y);
  if(x==y)  return;
  if(Rank[x]<Rank[y]){
    par[x]=y;
  }else{
    par[y]=x;
    if(Rank[x]==Rank[y])  Rank[x]++;
  }
}
bool same(int x,int y){
  return find(x)==find(y);
}
int main(){
  int n,m,ask,x,y;
  while(cin>>n>>m){
    init(n);
    for(int i=0;i<m;i++){
      cin>>ask>>x>>y;
      if(ask & 1){
        unite(x,y);
      }else{
        if(same(x,y))  cout<<"Yes\n";
        else           cout<<"No\n";
      }
    }
  }
  return 0;
}

E.喵哈哈村的代码传说 第五章 找规律

分析:裸SG函数
sg[0]=0
当x=8k+7时sg[x]=8k+8,
当x=8k+8时sg[x]=8k+7,
其余时候sg[x]=x;(k>=0)

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int T,n;
    scanf("%d",&T);
    while(T--)
    {
        int ans=0;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            int x,sg;
            scanf("%d",&x);
            if(x%8!=0&&x%8!=7)
                sg=x;
            else
                if(x%8==0) sg=x-1;else sg=x+1;
            ans^=sg;
        }
        if(ans) printf("First player wins.\n");else printf("Second player wins.\n");
    }
    return 0;
}
posted @ 2017-03-12 17:39  ojnQ  阅读(257)  评论(0编辑  收藏  举报