結果

提出番号 1328
提出者 naoki
言語 C++
提出日時 2018-06-25 08:50:15
問題名 (62)SuperCon2018(独自テスト)
結果 AC
点数 606000

テストケース

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

ソースコード

#include<stdio.h>
#include<stdlib.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,flg[21][21],bk,xo,yo,c=0; //cnt=道の総数,flg=マップ,xo=
void func(int,int,int); //目的の障害物の場所までの全探索
void func2(int,int,int); //目的の障害物の場所についてからの全探索
void func0(int,int,int);
int main(void){
	int i,j,temp,B[10],
		costh[8]={0,182,122,102,80,30,25,20},cost,flgt;
	
	//マップ初期化
	for(i=0;i<=20;i++){
		for(j=0;j<=20;j++) flg[i][j]=0;
	}
	
	//入力
	scInput();
	cost=0; flgt=0;
	for(i=0;i<scM;i++){
		if(scB[0][i]+scB[1][i]<=scN/2){
			bk=abs(scB[1][i])+abs(scB[0][i]);
			for(j=1;j<=7;j++){
				if(bk==j) cost+=costh[j];
			}	
		}
	}
	if(cost>200) flgt=1;
	if(flgt==0){
		//障害物の座標の降順ソート
		for(i=0;i<scM;i++) B[i]=abs(scB[0][i])+abs(scB[1][i]);
		for(i=0;i<scM-1;i++){
			for(j=i+1;j<scM;j++){
				if(B[i]<B[j]){
					temp=B[i]; B[i]=B[j]; B[j]=temp;
					temp=scB[0][i]; scB[0][i]=scB[0][j]; scB[0][j]=temp;
					temp=scB[1][i]; scB[1][i]=scB[1][j]; scB[1][j]=temp;
				}
			}
		}
		
	//	for(i=0;i<scM;i++) printf("%d %d\n",scB[0][i],scB[1][i]);
		if(scN==20) cnt=3273040;
		else if(scN==18) cnt=549648;
		else if(scN==16) cnt=94016;
		else if(scN==14) cnt=16464;
		c=0;
		flg[10][10]=1; //出発地点を障害物にする
		for(i=0;i<scM;i++){
			if(scB[0][i]+scB[1][i]<=scN/2){
				bk=abs(scB[1][i])+abs(scB[0][i]); //障害物から出発地点までの最短距離
				xo=scB[0][i]; yo=scB[1][i]; //目的の障害物の座標を退避
				flg[scB[1][i]+10][scB[0][i]+10]=2; //目的の障害物の場所を2に設定
				func(10,10,0);
				flg[scB[1][i]+10][scB[0][i]+10]=1; //目的の障害物を障害物に設定
			}
		}
	}
	else if(flgt==1){
	int f=0;
		for(i=0;i<scM;i++){
			if(scB[0][i]+scB[1][i]<=scN/2){
				f=1;
				if(abs(scB[1][i])+abs(scB[0][i])==1) c++;
				flg[scB[1][i]+10][scB[0][i]+10]=1;
			}
		}
		if(f==0){ //分かっている数の場合
			if(scN==20) cnt=3273040;
			if(scN==18) cnt=549648;
			if(scN==16) cnt=94016;
			if(scN==14) cnt=16464;
		}
		else if(c>=3) cnt=0; //出発地点の隣が3つ以上障害物なら戻ってこれない
		else {	
			cnt=0; //道の数初期化
			flg[10][10]=1;
			func0(10,10,0);
		}
	}	
	//出力
	scOutput(cnt);
		
	return 0;
}	
void func(int x,int y,int c){
	int i,j;
	if(c<scN){
		int xx=x,yy=y+1,bk2;//xx=次のx座標,yy=次のy座標,bk=戻るのに必要な距離
		bk2=abs(xx-10-xo)+abs(yy-10-yo);
		if(flg[yy][xx]!=1&&bk2+bk<=scN-(c+1)){ //障害物でないか,出発地点へ戻ってこれるか
			if(flg[yy][xx]==2) func2(xx,yy,c+1); //目的の障害物の場所に着いたら別に関数呼び出し
			else {
				flg[yy][xx]=1;
				func(xx,yy,c+1);
				flg[yy][xx]=0;
			}
		}
		
		xx=x+1,yy=y,bk2;
		bk2=abs(xx-10-xo)+abs(yy-10-yo);
		if(flg[yy][xx]!=1&&bk2+bk<=scN-(c+1)){
			if(flg[yy][xx]==2) func2(xx,yy,c+1);
			else {
				flg[yy][xx]=1;
				func(xx,yy,c+1);
				flg[yy][xx]=0;
			}
		}
		
		xx=x,yy=y-1,bk2;
		bk2=abs(xx-10-xo)+abs(yy-10-yo);
		if(flg[yy][xx]!=1&&bk2+bk<=scN-(c+1)){
			if(flg[yy][xx]==2) func2(xx,yy,c+1);
			else {
				flg[yy][xx]=1;
				func(xx,yy,c+1);
				flg[yy][xx]=0;
			}
		}
		
		xx=x-1,yy=y,bk2;
		bk2=abs(xx-10-xo)+abs(yy-10-yo);
		if(flg[yy][xx]!=1&&bk2+bk<=scN-(c+1)){
			if(flg[yy][xx]==2) func2(xx,yy,c+1);
			else {
				flg[yy][xx]=1;
				func(xx,yy,c+1);
				flg[yy][xx]=0;
			}
		}
	}
}
void func2(int x,int y,int c){
	int i,j;
	if(c<scN){ //進めるか
		int xx=x,yy=y+1,bk2; //xx=次のx座標,yy=次のy座標
		
		if(xx==10&&yy==10&&c+1==scN) cnt--; //出発地点に戻ってきたか
		else {
			bk2=abs(xx-10)+abs(yy-10); //bk=戻るのに必要な距離
			
			if(flg[yy][xx]==0&&bk2<=scN-(c+1)){ //障害物でないか,出発地点へ戻ってこれるか
				flg[yy][xx]=1; //その地点を障害物に設定にする
				func2(xx,yy,c+1);
				flg[yy][xx]=0; //その設定を解除
			}
		}
		
		xx=x+1; yy=y;
		
		if(xx==10&&yy==10&&c+1==scN) cnt--;
		else {
			bk2=abs(xx-10)+abs(yy-10);
			
			if(flg[yy][xx]==0&&bk2<=scN-(c+1)){
				flg[yy][xx]=1;
				func2(xx,yy,c+1);
				flg[yy][xx]=0;
			}
		}
		
		xx=x; yy=y+-1;
		if(xx==10&&yy==10&&c+1==scN) cnt--;
		else {
			bk2=abs(xx-10)+abs(yy-10);
			
			if(flg[yy][xx]==0&&bk2<=scN-(c+1)){
				flg[yy][xx]=1;
				func2(xx,yy,c+1);
				flg[yy][xx]=0;
			}
		} 
		
		xx=x+-1; yy=y;
		if(xx==10&&yy==10&&c+1==scN) cnt--;
		else {
			bk2=abs(xx-10)+abs(yy-10);
			
			if(flg[yy][xx]==0&&bk2<=scN-(c+1)){
				flg[yy][xx]=1;
				func2(xx,yy,c+1);
				flg[yy][xx]=0;
			}
		}
	}
}	
void func0(int x,int y,int c){
	if(c<scN){ //進めるか
		int xx=x,yy=y+1,bk; //xx=次のx座標,yy=次のy座標
		
		if(xx==10&&yy==10&&c+1==scN) cnt++; //出発地点に戻ってきたか
		else {
			bk=abs(xx-10)+abs(yy-10); //bk=戻るのに必要な距離
			
			if(flg[yy][xx]==0&&bk<=scN-(c+1)){ //障害物でないか,出発地点へ戻ってこれるか
				flg[yy][xx]=1; //その地点を障害物に設定にする
				func0(xx,yy,c+1);
				flg[yy][xx]=0; //その設定を解除
			}
		}
		
		xx=x+1; yy=y; //xx=次のx座標,yy=次のy座標,
	
		if(xx==10&&yy==10&&c+1==scN) cnt++; //出発地点に戻ってきたか
		else {
			bk=abs(xx-10)+abs(yy-10); //bk=戻るのに必要な距離
			
			if(flg[yy][xx]==0&&bk<=scN-(c+1)){ //障害物でないか,出発地点へ戻ってこれるか
				flg[yy][xx]=1; //その地点を障害物に設定にする
				func0(xx,yy,c+1);
				flg[yy][xx]=0; //その設定を解除
			}
		}
		
		xx=x; yy=y+-1; //xx=次のx座標,yy=次のy座標,
		if(xx==10&&yy==10&&c+1==scN) cnt++; //出発地点に戻ってきたか
		else {
			bk=abs(xx-10)+abs(yy-10); //bk=戻るのに必要な距離
			
			if(flg[yy][xx]==0&&bk<=scN-(c+1)){ //障害物でないか,出発地点へ戻ってこれるか
				flg[yy][xx]=1; //その地点を障害物に設定にする
				func0(xx,yy,c+1);
				flg[yy][xx]=0; //その設定を解除
			}
		}
		
		xx=x+-1; yy=y; //xx=次のx座標,yy=次のy座標,
		if(xx==10&&yy==10&&c+1==scN) cnt++; //出発地点に戻ってきたか
		else {
			bk=abs(xx-10)+abs(yy-10); //bk=戻るのに必要な距離
			
			if(flg[yy][xx]==0&&bk<=scN-(c+1)){ //障害物でないか,出発地点へ戻ってこれるか
				flg[yy][xx]=1; //その地点を障害物に設定にする
				func0(xx,yy,c+1);
				flg[yy][xx]=0; //その設定を解除
			}
		}
	}
}