結果

提出番号 1330
提出者 ume10
言語 C++
提出日時 2018-06-25 09:19:02
問題名 (62)SuperCon2018(独自テスト)
結果 AC
点数 448000

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 0 2ms 8432KB
2 AC 0 3ms 8640KB
3 AC 0 6ms 8720KB
4 AC 0 3ms 8432KB
5 AC 0 5ms 8448KB
6 AC 20000 25ms 8432KB
7 AC 30000 34ms 7776KB
8 AC 0 2ms 7792KB
9 AC 0 2ms 7632KB
10 AC 0 9ms 7776KB
テストケース 結果 得点 実行時間 メモリ使用量
11 AC 40000 52ms 8688KB
12 AC 0 3ms 7840KB
13 AC 60000 69ms 8704KB
14 AC 20000 32ms 8400KB
15 AC 0 7ms 7504KB
16 AC 0 5ms 7856KB
17 AC 30000 38ms 8176KB
18 AC 0 2ms 8400KB
19 AC 0 2ms 8416KB
20 AC 40000 48ms 7808KB
テストケース 結果 得点 実行時間 メモリ使用量
21 AC 10000 19ms 8432KB
22 AC 40000 43ms 7632KB
23 AC 100000 106ms 7840KB
24 AC 40000 49ms 8080KB
25 AC 20000 24ms 8400KB
26 AC 30000 35ms 8432KB
27 AC 0 6ms 7776KB
28 AC 40000 48ms 7520KB
29 AC 40000 51ms 7808KB
30 AC 0 5ms 7792KB
テストケース 結果 得点 実行時間 メモリ使用量
31 AC 100000 101ms 8720KB
32 AC 10000 14ms 7632KB
33 AC 20000 26ms 7504KB
34 AC 70000 80ms 8688KB
35 AC 50000 60ms 7552KB
36 AC 20000 23ms 8288KB
37 AC 20000 32ms 8432KB
38 AC 30000 36ms 8448KB
39 AC 30000 38ms 8064KB
40 AC 0 9ms 8448KB
テストケース 結果 得点 実行時間 メモリ使用量
41 AC 0 8ms 8336KB
42 AC 70000 81ms 8448KB
43 AC 50000 54ms 8432KB
44 AC 60000 62ms 7984KB
45 AC 60000 64ms 7536KB
46 AC 80000 84ms 7552KB
47 AC 20000 33ms 8448KB
48 AC 60000 63ms 7840KB
49 AC 70000 80ms 7248KB
50 AC 110000 118ms 8032KB
テストケース 結果 得点 実行時間 メモリ使用量
51 AC 120000 122ms 8736KB
52 AC 20000 29ms 7232KB
53 AC 20000 29ms 8432KB
54 AC 60000 67ms 8400KB
55 AC 40000 48ms 8416KB
56 AC 40000 44ms 8672KB
57 AC 60000 64ms 8400KB
58 AC 60000 69ms 7520KB
59 AC 80000 89ms 8288KB
60 AC 20000 27ms 7824KB
テストケース 結果 得点 実行時間 メモリ使用量
61 AC 80000 84ms 7920KB
62 AC 40000 46ms 8336KB
63 AC 10000 20ms 7776KB
64 AC 90000 95ms 8048KB
65 AC 80000 82ms 7792KB
66 AC 70000 78ms 7824KB
67 AC 70000 79ms 8384KB
68 AC 100000 107ms 7504KB
69 AC 100000 104ms 8720KB
70 AC 20000 26ms 7856KB
テストケース 結果 得点 実行時間 メモリ使用量
71 AC 40000 52ms 8272KB
72 AC 20000 27ms 8016KB
73 AC 10000 15ms 8432KB
74 AC 40000 51ms 7824KB
75 AC 100000 108ms 8720KB
76 AC 110000 118ms 7248KB
77 AC 70000 78ms 8672KB
78 AC 80000 82ms 8176KB
79 AC 70000 77ms 8032KB
80 AC 40000 43ms 8384KB
テストケース 結果 得点 実行時間 メモリ使用量
81 AC 60000 65ms 7920KB
82 AC 80000 85ms 7552KB
83 AC 60000 63ms 8416KB
84 AC 70000 81ms 8192KB
85 AC 40000 50ms 8736KB
86 AC 80000 83ms 7232KB
87 AC 70000 75ms 8096KB
88 AC 50000 55ms 8128KB
89 AC 90000 100ms 8400KB
90 AC 40000 53ms 8672KB
テストケース 結果 得点 実行時間 メモリ使用量
91 AC 60000 67ms 8096KB
92 AC 60000 67ms 8304KB
93 AC 40000 49ms 7488KB
94 AC 80000 89ms 8368KB
95 AC 110000 120ms 7808KB
96 AC 0 9ms 8432KB
97 AC 50000 59ms 8096KB
98 AC 50000 57ms 8688KB
99 AC 20000 33ms 7776KB
100 AC 60000 63ms 7520KB

ソースコード

#include<stdio.h>
#include<time.h>
int scN,scM;
int scB[2][10];
clock_t scStartTime,scEndTime;
void scInput(){
	int i;
	scanf("%d%d",&scN,&scM);
	for(i=0;i<scM;++i){scanf("%d%d",&scB[0][i],&scB[1][i]);}
	scStartTime=clock();
}
void scOutput(int s){
	scEndTime=clock();
	printf("Ans= %d, time=%d\n",s,(int)(scEndTime-scStartTime));
}
int cnt,cnt2,cnt3,cnt4,sa,sa1,sa2,sa3,flg[40][40],i,j,a,b,g1,g2,g3,aut,l,has[4],p,q,sam,min;
int func(int,int,int);
int func2(int,int,int);
int func3(int,int,int);
int main(void)
{
	int x,y;
	//入力
	scInput();
	//マップ初期化
	for(i=0;i<=scN;i++){
		for(j=0;j<=scN;j++) flg[i][j]=0;
	}
	//分岐きめ
	cnt3=0; g1=0; g2=0; g3=0; aut=0;
	for(i=0;i<scM;i++){
		x=scB[0][i]; y=scB[1][i];
		flg[x+scN/2][y+scN/2]=1;
	}
	for(i=0;i<4;i++) has[i]=0;
	//出入り口が埋まっているか
	if(flg[scN/2+1][scN/2]==1) has[0]=1,cnt3++;
	if(flg[scN/2][scN/2+1]==1) has[1]=1,cnt3++;
	if(flg[scN/2-1][scN/2]==1) has[2]=1,cnt3++;
	if(flg[scN/2][scN/2-1]==1) has[3]=1,cnt3++;
	if(cnt3>1) aut=1;//ある一定範囲に障害物が一定数あったら分岐
	for(i=scN/2-1;i<=scN/2+1;i++){
		for(j=scN/2-1;j<=scN/2+1;j++) if(flg[i][j]==1) g1++;
	}
	if(g1>1) aut=1;
	for(i=scN/2-2;i<=scN/2+2;i++){
		for(j=scN/2-2;j<=scN/2+2;j++) if(flg[i][j]==1) g2++;
	}
	if(g2>2) aut=1;
	for(i=0;i<=scN;i++){
		for(j=0;j<=scN;j++) flg[i][j]=0;
	}
	flg[scN/2][scN/2]=2; //中心設置
	cnt=0; //SWL
	cnt2=0; //深さ
	cnt3=0;
	//障害物設置
	if(aut==1&&cnt3<3){//足し算
		cnt3=0;
		//障害物設置
		for(i=0;i<scM;i++){
			x=scB[0][i]; y=scB[1][i];
			flg[x+scN/2][y+scN/2]=1;
			a=scN/2-(scN/2+x); b=scN/2-(scN/2+y);
			if(a<0) a*=-1;
			if(b<0) b*=-1;
			if(a==1&&b==0||a==0&&b==1) cnt3++;
		}
		for(i=0;i<scM;i++){
			x=scB[0][i]; y=scB[1][i];
			flg[x+scN/2][y+scN/2]=1;
			a=scN/2-(scN/2+x); b=scN/2-(scN/2+y);
			if(a<0) a*=-1;
			if(b<0) b*=-1;
			if(a==1&&b==0||a==0&&b==1) cnt3++;
		}
		func(scN/2,scN/2,0);
	}
	else{//引き算
		cnt=0; cnt2=0; cnt4=0; sam=0;
		for(i=0;i<scM;i++) flg[scN/2+scB[0][i]][scN/2+scB[1][i]]=3; //障害物設置
		flg[scN/2][scN/2]=2; //中心設置
		for(l=0;l<scM;l++){
			a=scB[0][l]; b=scB[1][l];
			if(a<0) a*=-1;
			if(b<0) b*=-1;
			sa=a+b;
			min=sa;
			sa1=scN-a-b;
			while(1){
				cnt3=0;
				if(sa1>=sa){
					func2(scN/2,scN/2,0);
					if(sa1>sa) sam+=cnt3*2;
					else sam+=cnt3;
					sa+=2; sa1-=2;
				}
				else break;
			}
			flg[scB[0][l]+scN/2][scB[1][l]+scN/2]=0;
		}
		if(scN==14) cnt=16464-sam;
		else if(scN==16) cnt=94016-sam;
		else if(scN==18) cnt=549648-sam;
		else if(scN==20) cnt=3273040-sam;
	}
	//出力
	scOutput(cnt);
	return 0;
}
int func(int x1,int y1,int cnt1){	//x1とy1は現在地 cnt1は進んだ距離
	// 最短で戻れる距離
	a=scN/2-x1; b=scN/2-y1;
	if(a<0) a*=-1;
	if(b<0) b*=-1;
	// 四方向見る
	if(cnt1+1==scN&&flg[x1+1][y1]==2||cnt1+1==scN&&flg[x1][y1+1]==2||
	cnt1+1==scN&&flg[x1-1][y1]==2||cnt1+1==scN&&flg[x1][y1-1]==2) cnt++; //最初の位置見る
	else if(cnt1+a+b<=scN){
		//下方向
		if(flg[x1+1][y1]==0){
			flg[x1+1][y1]=1; func(x1+1,y1,cnt1+1);
			flg[x1+1][y1]=0;
		}
		//右方向
		if(flg[x1][y1+1]==0){
			flg[x1][y1+1]=1; func(x1,y1+1,cnt1+1);
			flg[x1][y1+1]=0;
		}
		//上方向
		if(flg[x1-1][y1]==0){
			flg[x1-1][y1]=1; func(x1-1,y1,cnt1+1);
			flg[x1-1][y1]=0;
		}
		//左方向
		if(flg[x1][y1-1]==0){
			flg[x1][y1-1]=1; func(x1,y1-1,cnt1+1);
			flg[x1][y1-1]=0;
		}
	}
}
int func2(int x,int y,int cnt1){ //x,y現在地 cnt1進んだ距離
	a=scN/2+scB[0][l]-x; b=scN/2+scB[1][l]-y;
	if(a<0) a*=-1;
	if(b<0) b*=-1;
	sa2=a+b+cnt1;
	if(sa2<=sa){
		if(flg[x+1][y]==0){
			flg[x+1][y]=1; func2(x+1,y,cnt1+1);
			flg[x+1][y]=0;
		}
		else if(flg[x+1][y]==3&&cnt1+1==sa&&(scB[0][l]+scN/2==x+1&&scB[1][l]+scN/2==y)){
			func3(x+1,y,0);
		}
		if(flg[x][y+1]==0){
			flg[x][y+1]=1; func2(x,y+1,cnt1+1);
			flg[x][y+1]=0;
		}
		else if(flg[x][y+1]==3&&cnt1+1==sa&&(scB[0][l]+scN/2==x&&scB[1][l]+scN/2==y+1)){
			func3(x,y+1,0);
		}
		if(flg[x-1][y]==0){
			flg[x-1][y]=1; func2(x-1,y,cnt1+1);
			flg[x-1][y]=0;
		}
		else if(flg[x-1][y]==3&&cnt1+1==sa&&(scB[0][l]+scN/2==x-1&&scB[1][l]+scN/2==y)){
			func3(x-1,y,0);
		}
		if(flg[x][y-1]==0){
			flg[x][y-1]=1; func2(x,y-1,cnt1+1);
			flg[x][y-1]=0;
		}
		else if(flg[x][y-1]==3&&cnt1+1==sa&&(scB[0][l]+scN/2==x&&scB[1][l]+scN/2==y-1)){
			func3(x,y-1,0);
		}
	}
}
int func3(int x,int y,int cnt2){
	a=scN/2-x; b=scN/2-y;
	if(a<0) a*=-1;
	if(b<0) b*=-1;
	sa3=a+b+cnt2;
	if(cnt2+1==sa1&&flg[x+1][y]==2||cnt2+1==sa1&&flg[x][y+1]==2||
	cnt2+1==sa1&&flg[x-1][y]==2||cnt2+1==sa1&&flg[x][y-1]==2) cnt3++;
	else if(sa3<=sa1){
		//下方向
		if(flg[x+1][y]==0){
			flg[x+1][y]=1; func3(x+1,y,cnt2+1);
			flg[x+1][y]=0;
		}
		//右方向
		if(flg[x][y+1]==0){
			flg[x][y+1]=1; func3(x,y+1,cnt2+1);
			flg[x][y+1]=0;
		}
		//上方向
		if(flg[x-1][y]==0){
			flg[x-1][y]=1; func3(x-1,y,cnt2+1);
			flg[x-1][y]=0;
		}
		//左方向
		if(flg[x][y-1]==0){
			flg[x][y-1]=1; func3(x,y-1,cnt2+1);
			flg[x][y-1]=0;
		}
	}
}