Initial think
#include <stdio.h>
int c;
int clkTime[16];
int clkOfSW[10][5] = {
{0,1,2,-1,-1},//0
{3,7,9,11,-1},
{4,10,14,15,-1},
{0,4,5,6,7},
{6,7,8,10,12},
{0,2,14,15,-1},//5
{3,14,15,-1,-1},
{4,5,7,14,15},
{1,2,3,4,5},
{3,4,5,9,13}//9
};
int swSize2[10] = {3,4,4,5,5,4,3,5,5,5};
int swOfClk[16][4] = {
{0,3,5,-1},
{0,8,-1,-1},
{0,5,8,-1},
{1,6,8,9},
{2,3,5,8},
{3,7,8,9},//5
{3,4,-1,-1},
{1,3,4,7},
{4,-1,-1,-1},
{1,9,-1,-1},
{2,4,-1,-1},//10
{1,-1,-1,-1},
{4,-1,-1,-1},
{9,-1,-1,-1},
{2,5,6,7},
{2,5,6,7}//15
};
int swSize[16]= {3,2,3,4,4,4,2,4,1,2,2,1,1,1,4,4};
int curMin,cnt;
void sub();
FILE* fin;
FILE* fout;
int press[20000];
int pressCnt;
void main()
{
fin = fopen("in.txt","r");
fout = fopen("out.txt","w");
//scanf("%d", &c);
fscanf(fin,"%d",&c);
for (int i=0; i<c; i++)
{
for (int j=0; j<16; j++)
//scanf("%d",&(clkTime[j]));
fscanf(fin,"%d",&(clkTime[j]));
curMin = 65535;
cnt= 0;
pressCnt=0;
sub();
//printf("%d\n",curMin);
fprintf(fout,"%d\n",curMin);
}
fclose(fin);
fclose(fout);
}
void sub()
{
int clk = 0;
while (clk<15)
{
if (clkTime[clk] != 12) {
break;
}
clk++;
}
if (clk == 15)
{
if(curMin > cnt)
{
curMin = cnt;
fprintf(fout,"clk=15. cnrMin=%d\n\n",curMin);
}
return;
}
for(int sw=0; sw<swSize[clk]; sw++)
{
for (int cc=0; cc<swSize2[sw]; cc++)
{
clkTime[clkOfSW[sw][cc]] += 3;
if(clkTime[clkOfSW[sw][cc]] > 12) clkTime[clkOfSW[sw][cc]] -= 12;
}
cnt++;
press[pressCnt++] = sw;
fprintf(fout, "%d press. cnt=%d\n", sw, cnt);
for(int jj=0; jj<pressCnt; jj++) fprintf(fout,"%d ", press[jj]); fprintf(fout,"\ntime: ");
for(int jj=0; jj<16; jj++) fprintf(fout,"%d ", clkTime[jj]); fprintf(fout,"\n");
sub();
for (int cc=0; cc<swSize2[sw]; cc++)
{
clkTime[clkOfSW[sw][cc]] -= 3;
if(clkTime[clkOfSW[sw][cc]] == 0) clkTime[clkOfSW[sw][cc]] = 12;
}
cnt--;
pressCnt--;
fprintf(fout, "%d unpress. cnt=%d\n", sw, cnt);
for(int jj=0; jj<pressCnt; jj++) fprintf(fout,"%d ", press[jj]); fprintf(fout,"\ntime: ");
for(int jj=0; jj<16; jj++) fprintf(fout,"%d ", clkTime[jj]); fprintf(fout,"\n");
}
}
Posts List
2013년 8월 11일 일요일
2013년 8월 10일 토요일
BoardCover
Correct answer#include <stdio.h> #include <assert.h> int testNum, row, col; int Board[20][20]; int whiteCnt; int ans; void sub(); FILE *fin, *fout; void printBoard(FILE *fp) { for (int r=0; r<row; r++) { for(int c=0; c<col; c++) fprintf(fp, "%d ", Board[r][c]); fprintf(fp, "\n"); } } int main() { //fin = fopen("in.txt", "r"); //fout = fopen("out.txt", "w"); //fscanf(fin, "%d",&testNum); scanf("%d",&testNum); for (int ii=0; ii<testNum; ii++) { for (int r=0; r<row; r++) for (int c=0; c<col; c++) Board[r][c] = -1; whiteCnt = 0; ans = 0; //fscanf(fin, "%d%d",&row,&col); scanf("%d%d",&row,&col); char newline; //fscanf(fin, "%c", &newline); scanf("%c", &newline); for (int r=0; r<row; r++) { char buffer[20] = {0, }; fgets(buffer, 20, stdin); for (int c=0; c<col; c++) { if(buffer[c]=='#') Board[r][c] = 0; else if(buffer[c]=='.') { Board[r][c] = 1; whiteCnt++; } else assert(0); } } // do my work //printBoard(fout); sub(); //fprintf(fout, "\nans = %d\n", ans); printf("%d\n", ans); } //fclose(fin); //fclose(fout); return 0; } void sub() { //fprintf(fout, "--------------------\n"); //fprintf(fout, "row=%d, col=%d, whiteCnt=%d, sR=%d, sC=%d\n", row, col, whiteCnt, sR, sC); //printf("row=%d, col=%d, whiteCnt=%d, sR=%d, sC=%d\n", row, col, whiteCnt, sR, sC); //printBoard(fout); if (whiteCnt == 0) { ans++; //fprintf(fout, "ok! return. ans=%d\n", ans); //printf("ok! return.\n"); return; } if (whiteCnt < 3) { //fprintf(fout, "no room. stop here. whiteCnt=%d\n", whiteCnt); //printf("no room. stop here. whiteCnt=%d\n", whiteCnt); return; } if (whiteCnt % 3 != 0) { //fprintf(fout, "not multiple of 3. stop here. whiteCnt=%d\n", whiteCnt); //printf("not multiple of 3. stop here. stop here. whiteCnt=%d\n", whiteCnt); return; } bool find=false; int r=0, c=0; for (r=0; r<row; r++) { for (c=0; c<col; c++) { if (Board[r][c]==1) { find=true; break; } } if(find==true) break; } if (find == false) { //printf("no white.\n"); ans++; return; } //fprintf(fout, "(%d %d) ", r, c); // shape1 // 1 1 // x 1 if (r+1<row && c+1<col && Board[r][c]==1 && Board[r][c+1]==1 && Board[r+1][c+1]==1) { //fprintf(fout, "%d row, %d col, shape 1 matched\n", r, c); Board[r][c]=2; Board[r][c+1]=2; Board[r+1][c+1]=2; whiteCnt-=3; sub(); //fprintf(fout, "%d row, %d col : shape 1 roleback\n", r,c ); whiteCnt+=3; Board[r][c]=1; Board[r][c+1]=1; Board[r+1][c+1]=1; //printBoard(fout); } // shape2 // x 1 // 1 1 if (r+1<row && c-1>=0 && Board[r][c]==1 && Board[r+1][c]==1 && Board[r+1][c-1]==1) { //fprintf(fout, "%d row, %d col, shape 2 matched\n", r, c); Board[r][c]=2; Board[r+1][c]=2; Board[r+1][c-1]=2; whiteCnt-=3; sub(); //fprintf(fout, "%d row, %d col : shape 2 roleback\n", r, c); whiteCnt+=3; Board[r][c]=1; Board[r+1][c]=1; Board[r+1][c-1]=1; } // shape3 // 1 x // 1 1 if (r+1<row && c+1<col && Board[r][c]==1 && Board[r+1][c]==1 && Board[r+1][c+1]==1) { //fprintf(fout, "%d row, %d col, shape 3 matched\n", r, c); Board[r][c]=2; Board[r+1][c]=2; Board[r+1][c+1]=2; whiteCnt-=3; sub(); //fprintf(fout, "%d row, %d col : shape 3 roleback\n", r, c); whiteCnt+=3; Board[r][c]=1; Board[r+1][c]=1; Board[r+1][c+1]=1; //printBoard(fout); } // shape4 // 1 1 // 1 x if (r+1<row && c+1<col && Board[r][c]==1 && Board[r][c+1]==1 && Board[r+1][c]==1) { //fprintf(fout, "%d row, %d col, shape 4 matched\n", r, c); Board[r][c]=2; Board[r][c+1]=2; Board[r+1][c]=2; whiteCnt-=3; sub(); //fprintf(fout, "%d row, %d col : shape 4 roleback\n", r, c); whiteCnt+=3; Board[r][c]=1; Board[r][c+1]=1; Board[r+1][c]=1; //printBoard(fout); } //fprintf(fout, "no. return\n"); }
BoardCover
Timeout Answer
#include <stdio.h> #include <assert.h> int testNum, row, col; int Board[20][20]; int whiteCnt; int ans; FILE *fin, *fout; void sub(int sR, int sC, int prevShape); void printBoard(FILE *fp) { for (int r=0; r<row; r++) { for(int c=0; c<col; c++) fprintf(fp, "%d ", Board[r][c]); fprintf(fp, "\n"); } } int main() { //fin = fopen("in.txt", "r"); //fout = fopen("out.txt", "w"); //fscanf(fin, "%d",&testNum); scanf("%d",&testNum); for (int ii=0; ii<testNum; ii++) { for (int r=0; r<row; r++) for (int c=0; c<col; c++) Board[r][c] = -1; whiteCnt = 0; ans = 0; //fscanf(fin, "%d%d",&row,&col); scanf("%d%d",&row,&col); char newline; //fscanf(fin, "%c", &newline); scanf("%c", &newline); for (int r=0; r<row; r++) { char buffer[20] = {0, }; fgets(buffer, 20, stdin); for (int c=0; c<col; c++) { if(buffer[c]=='#') Board[r][c] = 0; else if(buffer[c]=='.') { Board[r][c] = 1; whiteCnt++; } else assert(0); } } // do my work //printBoard(fout); sub(0, 0, 0); //fprintf(fout, "\nans = %d\n", ans); printf("ans=%d\n", ans); } //fclose(fin); //fclose(fout); return 0; } void sub(int sR, int sC, int prevShape) { //fprintf(fout, "--------------------\n"); //fprintf(fout, "row=%d, col=%d, whiteCnt=%d, sR=%d, sC=%d\n", row, col, whiteCnt, sR, sC); //printf("row=%d, col=%d, whiteCnt=%d, sR=%d, sC=%d\n", row, col, whiteCnt, sR, sC); //printBoard(fout); if (whiteCnt == 0) { ans++; //fprintf(fout, "ok! return. ans=%d\n", ans); //printf("ok! return.\n"); return; } if (whiteCnt < 3) { //fprintf(fout, "no room. stop here. whiteCnt=%d\n", whiteCnt); //printf("no room. stop here. whiteCnt=%d\n", whiteCnt); return; } if (whiteCnt % 3 != 0) { //fprintf(fout, "not multiple of 3. stop here. whiteCnt=%d\n", whiteCnt); //printf("not multiple of 3. stop here. stop here. whiteCnt=%d\n", whiteCnt); return; } for (int r=sR; r<row-1; r=r+1) { int c = (r==sR)? sC: 0; while (c < col-1) { //fprintf(fout, "(%d %d) ", r, c); // shape1 // 1 1 // x 1 if (r+1<row && c+1<col && Board[r][c]==1 && Board[r][c+1]==1 && Board[r+1][c+1]==1) { //fprintf(fout, "%d row, %d col, shape 1 matched\n", r, c); Board[r][c]=2; Board[r][c+1]=2; Board[r+1][c+1]=2; whiteCnt-=3; if (c <= col-4) sub(r, c+2, 1); else sub(r+1, 0, 1); //fprintf(fout, "%d row, %d col : shape 1 roleback\n", r,c ); whiteCnt+=3; Board[r][c]=1; Board[r][c+1]=1; Board[r+1][c+1]=1; //printBoard(fout); } // shape2 // x 1 // 1 1 if (prevShape != 3 && r+1<row && c+1<col && Board[r][c+1]==1 && Board[r+1][c]==1 && Board[r+1][c-1]==1) { //fprintf(fout, "%d row, %d col, shape 2 matched\n", r, c); Board[r][c]=2; Board[r+1][c]=2; Board[r+1][c-1]=2; whiteCnt-=3; if (c <= col-4) sub(r, c+2, 2); else sub(r+1, c, 2); //fprintf(fout, "%d row, %d col : shape 2 roleback\n", r, c); whiteCnt+=3; Board[r][c]=1; Board[r+1][c]=1; Board[r+1][c-1]=1; } // shape3 // 1 x // 1 1 if (prevShape != 3 && r+1<row && c+1<col && Board[r][c]==1 && Board[r+1][c]==1 && Board[r+1][c+1]==1) { //fprintf(fout, "%d row, %d col, shape 3 matched\n", r, c); Board[r][c]=2; Board[r+1][c]=2; Board[r+1][c+1]=2; whiteCnt-=3; sub(r, c+1, 3); //fprintf(fout, "%d row, %d col : shape 3 roleback\n", r, c); whiteCnt+=3; Board[r][c]=1; Board[r+1][c]=1; Board[r+1][c+1]=1; //printBoard(fout); } // shape4 // 1 1 // 1 x if (prevShape != 3 && r+1<row && c+1<col && Board[r][c]==1 && Board[r][c+1]==1 && Board[r+1][c]==1) { //fprintf(fout, "%d row, %d col, shape 4 matched\n", r, c); Board[r][c]=2; Board[r][c+1]=2; Board[r+1][c]=2; whiteCnt-=3; if (c <= col-4) sub(r, c+2, 4); else sub(r+1, c, 4); //fprintf(fout, "%d row, %d col : shape 4 roleback\n", r, c); whiteCnt+=3; Board[r][c]=1; Board[r][c+1]=1; Board[r+1][c]=1; //printBoard(fout); } c = c + 1; } } //fprintf(fout, "no. return\n"); }
Picnic
Correct answer
#include <stdio.h> #include <vector> using namespace std; void sub(vector<int> v, int N, int start); int c, n, m; int in[50][2]; int ans; int relation[10][10]; int main () { int i,j; int tmp; // C = number of test case scanf("%d", &c); //printf("%d\n", c); for (i=0; i<c; i++) { for (int x=0; x<10; x++) for (int y=0; y<10; y++) relation[x][y] = 0; // n = number of student // m = number of pair scanf("%d %d", &n, &m); //printf("n = %d, m = %d\n", n,m); for (j=0; j<m; j++) { // in = array of pair scanf("%d %d", &in[j][0], &in[j][1]); if (in[j][0] > in[j][1]) { tmp = in[j][1]; in[j][1] = in[j][0]; in[j][0] = tmp; } // in[][0] < in[][1] is always TRUE //printf("(%d, %d) ", in[j][0], in[j][1]); relation[in[j][0]][in[j][1]] = 1; } vector<int> v; ans = 0; sub(v, n, 0); //printf("\n"); printf("%d", ans); if (i < c-1) printf("\n"); } } void sub(vector<int> v, int N, int start) { if (v.size() == N) { ans++; return; } for(int from=start; from<N; from++) { for(int to=from+1; to<N; to++) { if( relation[from][to]==1 ) { // check if vector has from or to bool bDup = false; for (int ii=0; ii<v.size(); ii++) { if(v.at(ii)==from || v.at(ii)==to) { bDup = true; break; } } if (bDup == false) { v.push_back(from); v.push_back(to); sub(v, N, from+1); v.pop_back(); v.pop_back(); } } } } }
피드 구독하기:
글 (Atom)