結果

問題 No.2986 Permutation Puzzle
ユーザー ID 21712
提出日時 2024-12-31 02:50:28
言語 Raku
(rakudo v2024.12)
結果
TLE  
実行時間 -
コード長 1,804 bytes
コンパイル時間 1,046 ms
コンパイル使用メモリ 151,964 KB
実行使用メモリ 342,296 KB
最終ジャッジ日時 2024-12-31 02:51:59
合計ジャッジ時間 90,187 ms
ジャッジサーバーID
(参考情報)
judge5 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3 TLE * 1
other AC * 23 TLE * 17
権限があれば一括ダウンロードができます
コンパイルメッセージ
Syntax OK

ソースコード

diff #

sub issame($n, @b, @a, @icol, @irow) {
	for ( 1 .. $n ) -> $r {
		for ( 1 .. $n ) -> $c {
			if ( @b[$r-1][$c-1] != @a[@irow[$r-1]-1][@icol[$c-1]-1]) {
				return 0;
			}
		}
	}
	return 1;
}

sub search($n,@b,$k,@a,@icol,@irow,@ops,@p) {

	if ( $k == 0 ) {
		return issame($n, @b, @a, @icol, @irow);
	}
	
	my @itmp = 1 .. $n;
	
	for ( 1 .. (2*$n) ) -> $op {
		@ops[$k-1] = $op;
		if ( $op <= $n ) {
			for ( 1 .. $n ) -> $r {
				@p[$k-1][$r-1] = @a[@irow[$r-1]-1][@icol[$op-1]-1];
			}
			for ( 1 .. $n ) -> $e {
				@itmp[ @p[$k-1][$e-1]-1 ] = @icol[$e-1];
			}
			if ( search($n, @b, $k-1, @a, @itmp, @irow, @ops, @p) ) {
				return 1;
			}
		} else {
			for ( 1 .. $n ) -> $c {
				@p[$k-1][$c-1] = @a[@irow[$op-1-$n]-1][@icol[$c-1]-1];
			}
			for ( 1 .. $n ) -> $e {
				@itmp[ @p[$k-1][$e-1]-1 ] = @irow[$e-1];
			}
			if ( search($n, @b, $k-1, @a, @icol, @itmp, @ops, @p) ) {
				return 1;
			}		}
	}
	
	return 0;
}


my @words = words.slice(0..1000).map({ $_-0 });

my ( $n , $k ) = @words[0..1];
my @a = ( 1 .. $n ).map({ @words[$_*$n-$n+2..$_*$n+2-1] });
my @b = ( 1 .. $n ).map({ @words[$_*$n-$n+$n*$n+2..$_*$n+$n*$n+2-1] });

my @icol = 1 .. $n;
my @irow = 1 .. $n;
my @ops = 1 .. $k;
my @p = ( 1 .. $k ).map({ my @x = 1 .. $n; @x }) ;

search($n, @b, $k, @a, @icol, @irow, @ops, @p);

my @ans = ();

for ( 1 .. $k ) -> $j {
	my $op = @ops[$j-1];
	my @w = @p[$j-1][0..$n-1];
	my @t = 1 .. $n;
	my $z = ($op-1) % $n;
	while (1) {
		for ( 1 .. $n ) -> $i {
			@t[@p[$j-1][$i-1]-1] = @w[$i-1];
		}
		if ( join("",@t) eq join("",@p[$j-1][0..$n-1]) ) {
			last;
		}
		$z = @p[$j-1][$z]-1;
		if ( $op <= $n ) {
			push(@ans, $z+1);
		} else {
			push(@ans, $z+1+$n);
		}
		@w = @t;
	}
}

say @ans.Int;
for @ans -> $op {
	if ($op <= $n) {
		say "C " ~ ($op);
	} else {
		say "R " ~ ($op-$n);
	}
}

0