Submission #603651


Source Code Expand

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
using namespace std;

const int MOD=1e9+7;

int ct[26]={0};

int dp[40000000];

//現在の盤の状態nowSTのとき、posに置くことは出来るか
bool isValid(int st, int pos){
	//置くことが許されている場所か判定する
	bool valid=true;
	//左右判定
	if(pos%5==0 || pos%5==4){ //端なのでok
	}
	else{
		//左隣と右隣のbitのXORをとって1なら片方空き、ダメ
		if( ((st>>(pos-1))&1)^((st>>(pos+1))&1) ){
			valid=false;
		}
	}

	//上下判定
	if(pos<5||19<pos){ //端なのでok
	}
	else{
		//上と下のbitのXORをとって1なら片方空き、ダメ
		if( ((st>>(pos-5))&1)^((st>>(pos+5))&1) ){
			valid=false;
		}
	}

	return valid;
}

int rec(int st){ //現在盤面の状態をビットで表す
	if(dp[st]>=0) return dp[st];

	//全てのマスが埋まった
	if(st==(1<<25)-1) return 1;

	int now=1; //今置こうとしている数字
	for(int i=0; i<25; ++i){
		if((st>>i)&1){ //既に数字が置かれている
			++now;
		}
	}
	//printf("now %d, ct:%d\n", now, ct[now]);
	int ret=0;

	if(ct[now]>=0){ //最初から指定されている
		//置くはずの場所にすでにあるのはNG
		if( ((st>>(ct[now]))&1) == 0 ){
			if(isValid(st,ct[now])){
				//printf("th %d\n", now);
				ret =rec(st+(1<<ct[now]));
				ret%=MOD;
			}
		}
	}
	else{ //決まってないのでおける位置を試す
		for(int i=0; i<25; ++i){ //マスを左上から順に探していく
			if((st>>i)&1){ //もう埋まってて置けない
				continue;
			}

			if(isValid(st,i)){
				//printf("put %d to %d\n", now, i);
				ret += rec(st+(1<<i));
				ret %= MOD;
			}
			//else printf("fail\n");
		}
	}

	return dp[st]=ret;
}

int main(int argc, char const *argv[]) {
	//初期化
	for(int i=1; i<=25; ++i) ct[i]=-1;

	//input
	for(int i=0; i<25; ++i){
		int x;
		scanf(" %d", &x);
		if(x>0) ct[x]=i;
		//printf("ct[%d]=%d\n",x,ct[x]);
	}

	memset(dp,-1,sizeof(dp));
	printf("%d\n", rec(0));

	return 0;
}

Submission Info

Submission Time
Task D - 25個の整数
User imulan
Language C++ (GCC 4.9.2)
Score 100
Code Size 2148 Byte
Status AC
Exec Time 982 ms
Memory 157720 KB

Compile Error

./Main.cpp: In function ‘int main(int, const char**)’:
./Main.cpp:91:19: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   scanf(" %d", &x);
                   ^

Judge Result

Set Name Sample Subtask1 Subtask2
Score / Max Score 0 / 0 30 / 30 70 / 70
Status
AC × 4
AC × 19
AC × 29
Set Name Test Cases
Sample sample-01.txt, sample-02.txt, sample-03.txt, sample-04.txt
Subtask1 sample-01.txt, sample-02.txt, sample-03.txt, sample-04.txt, test-1-01.txt, test-1-02.txt, test-1-03.txt, test-1-04.txt, test-1-05.txt, test-1-06.txt, test-1-07.txt, test-1-08.txt, test-1-09.txt, test-1-10.txt, test-1-11.txt, test-1-12.txt, test-1-13.txt, test-1-14.txt, test-1-15.txt
Subtask2 sample-01.txt, sample-02.txt, sample-03.txt, sample-04.txt, test-1-01.txt, test-1-02.txt, test-1-03.txt, test-1-04.txt, test-1-05.txt, test-1-06.txt, test-1-07.txt, test-1-08.txt, test-1-09.txt, test-1-10.txt, test-1-11.txt, test-1-12.txt, test-1-13.txt, test-1-14.txt, test-1-15.txt, test-2-01.txt, test-2-02.txt, test-2-03.txt, test-2-04.txt, test-2-05.txt, test-2-06.txt, test-2-07.txt, test-2-08.txt, test-2-09.txt, test-2-10.txt
Case Name Status Exec Time Memory
sample-01.txt AC 359 ms 157584 KB
sample-02.txt AC 582 ms 157588 KB
sample-03.txt AC 346 ms 157592 KB
sample-04.txt AC 343 ms 157588 KB
test-1-01.txt AC 350 ms 157592 KB
test-1-02.txt AC 349 ms 157592 KB
test-1-03.txt AC 348 ms 157588 KB
test-1-04.txt AC 344 ms 157592 KB
test-1-05.txt AC 347 ms 157588 KB
test-1-06.txt AC 346 ms 157624 KB
test-1-07.txt AC 342 ms 157592 KB
test-1-08.txt AC 346 ms 157588 KB
test-1-09.txt AC 352 ms 157588 KB
test-1-10.txt AC 368 ms 157524 KB
test-1-11.txt AC 380 ms 157720 KB
test-1-12.txt AC 375 ms 157572 KB
test-1-13.txt AC 385 ms 157524 KB
test-1-14.txt AC 359 ms 157548 KB
test-1-15.txt AC 354 ms 157588 KB
test-2-01.txt AC 400 ms 157596 KB
test-2-02.txt AC 455 ms 157716 KB
test-2-03.txt AC 350 ms 157588 KB
test-2-04.txt AC 367 ms 157512 KB
test-2-05.txt AC 549 ms 157592 KB
test-2-06.txt AC 982 ms 157588 KB
test-2-07.txt AC 501 ms 157592 KB
test-2-08.txt AC 693 ms 157588 KB
test-2-09.txt AC 931 ms 157600 KB
test-2-10.txt AC 889 ms 157588 KB