「AOJ221~230」の編集履歴(バックアップ)一覧に戻る
#include <stdio.h> #include <string> #include <list> #include <iostream> void solve(int m,int n); int main() { int m,n; scanf("%d %d",&m,&n); while(m!=0 || n!=0){ solve(m,n); scanf("%d %d",&m,&n); } } void solve(int m,int n){ std::string t; std::list<int> memo; for(int i=m;i>0;i--){ memo.push_front(i); } bool isDell,end=false; std::list<int>::iterator it=memo.begin(); for(int i=1;i<n+1;i++){ std::cin>>t; if(end==true)continue; isDell=false; if(i%15==0){ if(t!="FizzBuzz"){ isDell=true; } }else if(i%5==0){ if(t!="Buzz"){ isDell=true; } }else if(i%3==0){ if(t!="Fizz"){ isDell=true; } }else{ int num; if(sscanf(t.c_str(),"%d",&num)==0 || num!=i){ isDell=true; } } if(isDell==true){ it=memo.erase(it); if(memo.size()==1) end=true; }else{ it++; } if(memo.end()==it) it=memo.begin(); } it=memo.begin(); printf("%d",*it); it++; while(it!=memo.end()){ printf(" %d",*it); it++; } printf("\n"); }
#include <stdio.h> #include <math.h> #include <vector> bool primeCheck(int n){ for(int i=3;i<(int)sqrt((double)n)+1;i++){ if(n%i==0){ return false; } } return true; } bool quadrupletCheck(int n){ if(primeCheck(n) && primeCheck(n-2) && primeCheck(n-6) && primeCheck(n-8)){ return true; }else{ return false; } } int main(){ std::vector<int> datas; std::vector<int>::iterator it; for(int i=13;i<10000001;i+=2){ if(quadrupletCheck(i)){ datas.push_back(i); } } FILE *fp; fp = fopen("mydata.txt", "w"); it=datas.begin(); while(it!=datas.end()){ fprintf(fp, "%d,", (*it)); it++; } fclose(fp); }
#include<stdio.h> #include<queue> #include<set> #include<algorithm> #include<stdlib.h> struct point{ char x1,y1,x2,y2; int turn; bool operator<(const point& p)const{ if(x1!=p.x1) return x1<p.x1; if(y1!=p.y1) return y1<p.y1; if(x2!=p.x2) return x2<p.x2; return y2<p.y2; } }; int dxs[]={1,0,-1,0}; int dys[]={0,1,0,-1}; void setData(int X,int Y){ point p,nextP; p.turn=0; int map[54][54]; std::queue<point> qu; std::set<point> memo; scanf("%d %d %d %d",&p.x1,&p.y1,&p.x2,&p.y2); for(int i=0;i<=Y+1;i++){ for(int j=0;j<=X+1;j++){ if(i==0 || i==Y+1 || j==0 || j==X+1){ map[i][j]=1; }else{ scanf(" %d",&map[i][j]); } } } qu.push(p); memo.insert(p); int nx1,ny1,nx2,ny2; while(!qu.empty()){ p=qu.front(); qu.pop(); if(p.turn==100){ break; } nextP.turn=p.turn +1; for(int i=0;i<4;i++){ nx1=p.x1+dxs[i]; ny1=p.y1+dys[i]; nx2=p.x2-dxs[i]; ny2=p.y2-dys[i]; if(map[ny1][nx1]==1){ nx1=p.x1; ny1=p.y1; } if(map[ny2][nx2]==1){ nx2=p.x2; ny2=p.y2; } if((100-nextP.turn)*2<abs(nx2-nx1)+abs(ny2-ny1))continue; nextP.x1=nx1; nextP.y1=ny1; nextP.x2=nx2; nextP.y2=ny2; if(nextP.x1==nextP.x2 && nextP.y1==nextP.y2){ printf("%d\n",nextP.turn); return; } if(memo.find(nextP)==memo.end()){ memo.insert(nextP); qu.push(nextP); } } } printf("NA\n"); } int main(){ int X,Y; while(scanf("%d %d",&X,&Y),X+Y>0){ setData(X,Y); } }
#include<stdio.h> #include<queue> #include<set> #include<algorithm> int dxs[]={1,0,-1,0}; int dys[]={0,1,0,-1}; void setData(int X,int Y){ int map[54][54]; std::queue<int> qu;//兄弟の位置を6bitずつ管理先頭8bitにターン数の保持 std::set<int> memo; int x1,x2,y1,y2; int state=0,nextState=0; scanf("%d %d %d %d",&x1,&y1,&x2,&y2); state=(1<<24)|(x1<<18)|(y1<<12)|(x2<<6)|(y2); for(int i=0;i<=Y+1;i++){ for(int j=0;j<=X+1;j++){ if(i==0 || i==Y+1 || j==0 || j==X+1){ map[i][j]=1; }else{ scanf(" %d",&map[i][j]); } } } qu.push(state); memo.insert(state); int nx1,ny1,nx2,ny2,turn,mask=63; while(!qu.empty()){ state=qu.front(); qu.pop(); turn=(state>>24); if(turn==100){ break; } turn++; x1=(state>>18)&mask; y1=(state>>12)&mask; x2=(state>>6)&mask; y2=state&mask; for(int i=0;i<4;i++){ nx1=x1+dxs[i]; ny1=y1+dys[i]; nx2=x2-dxs[i]; ny2=y2-dys[i]; if(map[ny1][nx1]==1){ nx1=x1; ny1=y1; } if(map[ny2][nx2]==1){ nx2=x2; ny2=y2; } if(nx1==nx2 && ny1==ny2){ printf("%d\n",turn-1); return ; } nextState=0; nextState=(nx1<<18)|(ny1<<12)|(nx2<<6)|ny2; if(memo.find(nextState)==memo.end()){ memo.insert(nextState); nextState|=(turn<<24); qu.push(nextState); } } } printf("NA\n"); } int main(){ int X,Y; while(scanf("%d %d",&X,&Y),X+Y>0){ setData(X,Y); } }
#include<stdio.h> #include<map> #include<string> std::map<std::string,int> points; int graph[128][128]; int ansCalorie; bool moveOKs[10]; int calorieMemo[10]; const int startPoint=0; const int endPoint=1; const int mymax=1000000000; void FloydWarshall(int size,int m){ int t; for(int y=0;y<size;y++){ for(int x=0;x<size;x++){ if(graph[y][x]==mymax || (1<y && y<m+2)) continue; for(int i=0;i<size;i++){ t=graph[x][y]+graph[y][i]; if(t<graph[x][i]){ graph[x][i]=t; } } } } } void saiki(int all,int nowCalorie,int nowP){ if(nowP==endPoint){ ansCalorie=nowCalorie>ansCalorie?ansCalorie:nowCalorie; }else{ for(int i=0;i<all;i++){ if(i==nowP)continue; if(moveOKs[i]==true && graph[nowP][i]<mymax){ moveOKs[i]=false; int nextCalorie=nowCalorie+graph[nowP][i]-calorieMemo[i]; saiki(all,nextCalorie,i); moveOKs[i]=true; } } } } bool setData(){ int m,n,k,d; scanf("%d %d %d %d",&m,&n,&k,&d); if(m==0 && n==0 && k==0 && d==0) return false; points.clear(); for(int i=0;i<m+n+2;i++){ for(int j=0;j<m+n+2;j++){ graph[i][j]=(i==j)?0:mymax; } } ansCalorie=mymax; for(int i=0;i<10;i++)moveOKs[i]=true; int calorie,p=2; char cake[5],land[5]; calorieMemo[0]=calorieMemo[1]=0; points["H"]=0; points["D"]=1; for(int i=0;i<m;i++){ scanf("%d",&calorieMemo[p]); sprintf(cake,"C%d",i+1); points[cake]=p; p++; } for(int i=0;i<n;i++){ sprintf(land,"L%d",i+1); points[land]=p; p++; } char name1[5],name2[5]; int len,p1,p2; for(int i=0;i<d;i++){ scanf("%s %s %d",name1,name2,&len); p1=points[name1]; p2=points[name2]; graph[p1][p2]=graph[p2][p1]=len*k; } FloydWarshall(m+n+2,m); saiki(m+2,0,0); printf("%d\n",ansCalorie); return true; } int main(){ while(setData()){ } }
#include<stdio.h> #include <string.h> const int cSize=26; bool moveOKs[cSize]; int map[cSize][cSize]; int moveCount; void saiki(int nowP){ moveCount--; moveOKs[nowP]=false; for(int i=0;i<cSize;i++){ if(moveOKs[i]==true && map[nowP][i]>0){ saiki(i); } } } void setMap(int n){ char word[33],we; int first; int in[cSize],out[cSize]; memset(map,0,cSize*cSize*4); memset(in,0,cSize*4); memset(out,0,cSize*4); memset(moveOKs,true,cSize); for(int i=0;i<n;i++){ scanf("%s",word); we=word[strlen(word)-1]-'a'; map[word[0]-'a'][we]++; in[word[0]-'a']++; out[we]++; } bool roopOK=true; moveCount=0; for(int i=0;i<cSize;i++){ if(in[i]!=out[i])roopOK=false; if(in[i]>0){ first=i; moveCount++; } } if(roopOK==true){ saiki(first); } if(roopOK==true && moveCount==0){ printf("OK\n"); }else{ printf("NG\n"); } } int main(void) { int n; scanf("%d",&n); while(n>0){ setMap(n); scanf("%d",&n); } }
#include<stdio.h> int main(){ int de[]={0,63,6,91,79,102,109,125,39,127,111}; int num,next,ans,n; while(1){ scanf("%d",&n); if(n==-1)break; num=-1; while(n--){ scanf("%d",&next); ans=de[num+1]^de[next+1]; for(int i=0;i<7;i++){ printf("%d",(ans&64)==0?0:1); ans=ans<<1; } printf("\n"); num=next; } } }
#include<stdio.h> #include<string.h> #include <algorithm> int mymax=1000000000; void moveCheck(int moves[101],int bill[101],int n){ for(int i=0;i<n-1;i++){ //梯子を登る処理 if(bill[i]==1 && bill[i+1]==1){ moves[i+1]=std::min(moves[i],moves[i+1]); moves[i]=mymax; } } for(int i=n-1;i>=1;i--){ //滑る壁を降りる処理 if(bill[i]==2){ moves[i-1]=std::min(moves[i],moves[i-1]); moves[i]=mymax; } } } void jumpMove(int moves[2][101],int n,int now){ int next=(now+1)%2; for(int i=0;i<n-1;i++){ for(int k=0;k<3;k++){ if(i+k>=n) continue; moves[next][i+k]=std::min(moves[next][i+k],moves[now][i]+1); } } } void setData(int n){ int bills[2][101]; int moves[2][101]; for(int i=0;i<2*n;i++){ scanf("%d",&bills[i/n][i%n]); moves[i/n][i%n]=mymax; } moves[0][0]=moves[1][0]=0; int ans=mymax; moveCheck(moves[0],bills[0],n);//いきなりはしごで到達できる可能性を考慮 moveCheck(moves[1],bills[1],n); for(int i=0;i<2*n+3;i++){ ans=std::min(moves[0][n-1],moves[1][n-1]); jumpMove(moves,n,0);//0番目のビルから1番目のビルへの移動 moveCheck(moves[1],bills[1],n); jumpMove(moves,n,1);//1番目同上 moveCheck(moves[0],bills[0],n); } if(ans==mymax){ printf("NA\n"); }else{ printf("%d\n",ans); } } int main(){ int n; while(1){ scanf("%d",&n); if(n==0) break; setData(n); } }