「AOJ再挑戦66~70」の編集履歴(バックアップ)一覧に戻る
#include<stdio.h> int main(){ char *r="0001223613432311",b[10],i,t,p,d; while(scanf("%s",b)>0){ t=i=0; while(i<8){ d=r[i+8]%8; p=r[i++]%8; t|=((b[p]|b[p+d]|b[p+d*2])&18)%3; } printf("%c\n","dxo"[t]); } }
#include<stdio.h> #include<set> #include<iostream> const int SIZE=12; int main(){ char nowP; while(1){ std::set<long long int> spentsNo; std::set<long long int>::reverse_iterator rIt; spentsNo.insert(0); long long int ansAdd=0; long long int oldRowMemo[SIZE]={0}; for(int r=0;r<SIZE;r++){ long long int nowRowMemo[SIZE]={0}; for(int c=0;c<SIZE;c++){ scanf("%c",&nowP); if(nowP=='0'){ oldRowMemo[c]=nowRowMemo[c]=0; continue; } long long int max=0; if(0<c){ max=nowRowMemo[c-1]; } if(0<r){ max=max>oldRowMemo[c]?max:oldRowMemo[c]; } if(max==0){ rIt=spentsNo.rbegin(); max=(*rIt)+1; spentsNo.insert(max); } nowRowMemo[c]=max; long long int t=nowRowMemo[c-1]; if(0<c&&t>0&&t<max){ spentsNo.erase(t); } t=oldRowMemo[c]; if(0<r&&t>0&&t<max){ spentsNo.erase(t); } oldRowMemo[c]=max; } scanf("%c",&nowP);//改行読み込み //いらないデータの掃除 std::set<long long int> nowRowSet,dellNo; for(int i=0;i<SIZE;i++){ nowRowSet.insert(nowRowMemo[i]); } for(rIt=spentsNo.rbegin();rIt!=spentsNo.rend();rIt++){ if(nowRowSet.find((*rIt))==nowRowSet.end()&&(*rIt)>0){ dellNo.insert((*rIt)); } } ansAdd+=dellNo.size(); for(rIt=dellNo.rbegin();rIt!=dellNo.rend();rIt++){ spentsNo.erase((*rIt)); } } std::cout<<spentsNo.size()-1+ansAdd<<"\n"; if(scanf("%c",&nowP)==EOF)break; } }
#include<stdio.h> #include<math.h> double calcCos(double x0,double y0,double x1,double y1,double dx0,double dy0){ double dx1=x1-x0; double dy1=y1-y0; double len0=hypot(dx0,dy0); double len1=hypot(dx1,dy1); double naiseki=dx0*dx1+dy0*dy1; return naiseki/(len0*len1); } void calc(int n){ double xs[101],ys[101],downY=1001,leftX=1001,oldDx=1,oldDy=0; int nowP,oldP,startP,count=0; //問題で言及されてる内容からいろいろ手抜き処理で記述 //言及がなければ無限ループになる可能性あり for(int i=0;i<n;i++){ scanf("%lf,%lf",&xs[i],&ys[i]); if((ys[i]<downY)||(ys[i]==downY&&xs[i]<leftX)){ downY=ys[i]; leftX=xs[i]; startP=oldP=i; } } while(count<2||nowP!=startP){ double cosMax=-1,cosTemp; for(int i=0;i<n;i++){ if(i==oldP)continue; cosTemp=calcCos(xs[oldP],ys[oldP],xs[i],ys[i],oldDx,oldDy); if(cosTemp>cosMax){ nowP=i; cosMax=cosTemp; } } oldDx=xs[nowP]-xs[oldP]; oldDy=ys[nowP]-ys[oldP]; oldP=nowP; count++; } printf("%d\n",n-count); } int main(){ int n; while(scanf("%d",&n)!=EOF){ if(n==0)break; calc(n); } }