思路:一开始想到dfs套模板来用,可是发现像12346这种无法扫描到。从已经剪下来的任一个点都可以开始dfs。这样就不会漏掉情况
图中的123456789101112数字没有用处。在判断重复的时候简单的压缩一下,2的13次方之内的即可存储
#include <iostream>
#include <cstdio>
using namespace std;
int map[3][4];
int ans;
int dir[4][2] = {0,1,0,-1,1,0,-1,0};
int temp;
bool hash[6000];
void dfs( int num ) {
if ( num==5 ) {
temp = 0;
for ( int i=0;i<3; i++ ) {
for( int j=0; j<4; j++ ) {
temp = temp<<1;
temp += map[i][j];
}
}
if ( !hash[temp] ) {
hash[temp] = true;
++ans;
}
return ;
}
int ti,tj;
for ( int i=0; i<3; i++ ) {
for ( int j=0; j<4; j++ ) {
if ( map[i][j] ) {
for ( int f=0; f<4; f++ ) {
ti = i+dir[f][0];
tj = j+dir[f][1];
if ( ti<0 || tj<0 || ti>=3 || tj>=4 ) continue;
else {
if ( map[ti][tj]==0 ) {
map[ti][tj] = 1;
dfs(num+1);
map[ti][tj] = 0;
}
}
}
}
}
}
}
int main()
{
for ( int i=0; i<3; i++ ) {
for ( int j=0; j<4; j++ ) {
map[i][j] = 1;
dfs(1);
map[i][j] = 0;
}
}
cout<<ans;
return 0;
}