제가 생각할 수 있는 모든 예제들을 넣어서 확인해 보았을 때 결과가 정상적으로 나오고 있는데
정답 제출만 하면 오답이라고 나오네요 T.T
혹시 어떤 부분이 잘못 된건지 알 수 있을까요?
제가 생각하는 기본 알고리즘은 주석으로 적었습니다...
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#define MAX_ROWCOL 501#define manual_input 0 // how to get the input#define debug 0 inttest_case;intwidth,hight;charbact_table[MAX_ROWCOL][MAX_ROWCOL];intIsChanged=0;intseconds=0;intread_input();intcheck_around(introw,intcol);voidinit_data();intmain(){intresult=0;result=read_input();returnresult;// no meaning}intread_input(){intresult=0,IsExtinct=1;FILE*fp;if(!manual_input){fp=fopen("input.txt","rt");if(fp==NULL)return1;}if(manual_input)scanf("%d",&test_case);// input number of test caseelsefscanf(fp,"%d",&test_case);for(intk=0;k<test_case;k++){if(!manual_input)fscanf(fp,"%d %d",&width,&hight);elsescanf("%d %d",&width,&hight);// input W and Hfor(inti=0;i<hight;i++){if(!manual_input)fscanf(fp,"%s",&bact_table[i]);// input bacteriaselsescanf("%s",&bact_table[i]);}if(debug){// only for debug for(inti=0;i<hight;i++){for(intj=0;j<width;j++){printf("%c",bact_table[i][j]);}printf("\n");}}while(1){// repeat until there are no change(dead)IsChanged=0;IsExtinct=1;for(inti=0;i<hight;i++){for(intj=0;j<width;j++){result=check_around(i,j);if(result)IsExtinct=0;// IsExtinct is a flag to check initial state have bacteria or notif(debug)printf("%d",result);}if(debug)printf("\n");}for(inti=0;i<hight;i++){for(intj=0;j<width;j++){if(bact_table[i][j]=='@'){// if bacteria died just ago, replace @ to . again.bact_table[i][j]='.';// and set IsChanged flag as trueIsChanged=1;}}}if(debug)printf("IsChanged : %d, seconds %d ,IsExtinct %d\n",IsChanged,seconds,IsExtinct);if(!IsChanged)// stop if there are no change of bacteria lifebreak;else// increase seconds counter if there are changes of bacteria lifeseconds++;};// In case of all bacteria extincted or initial state have no bacteriaif((seconds&&IsExtinct)||(!seconds&&IsExtinct))printf("%d\n",seconds);// print seconds( or 0)elseprintf("-1\n");// In case of no baceria extinctsinit_data();// init variables}if(!manual_input)fclose(fp);return0;}intcheck_around(introw,intcol){intcnt=0,ret=0;if(bact_table[row][col]=='*'){if(col)if((bact_table[row][col-1]=='*')||(bact_table[row][col-1]=='@'))// check left cellcnt++;if(col!=(width-1))if((bact_table[row][col+1]=='*')||(bact_table[row][col+1]=='@'))// check right cellcnt++;if(row)if((bact_table[row-1][col]=='*')||(bact_table[row-1][col]=='@'))// check upper cellcnt++;if(row!=(hight-1))if((bact_table[row+1][col]=='*')||(bact_table[row+1][col]=='@'))//check below cellcnt++;ret=1;}if((cnt!=2)&&(bact_table[row][col]!='.')){// if it will diebact_table[row][col]='@';// @ means just ago "dead" }returnret;// return 0 if it is not a bacteria// return 1 if it is a bacteria}voidinit_data(){for(inti=0;i<MAX_ROWCOL;i++)for(intj=0;j<MAX_ROWCOL;j++){bact_table[i][j]=0;}IsChanged=0;seconds=0;}
oasis876
제가 생각할 수 있는 모든 예제들을 넣어서 확인해 보았을 때 결과가 정상적으로 나오고 있는데
정답 제출만 하면 오답이라고 나오네요 T.T
혹시 어떤 부분이 잘못 된건지 알 수 있을까요?
제가 생각하는 기본 알고리즘은 주석으로 적었습니다...
9년 전