为什么网上有这么多的DFS
最少需要多少次出牌,最少,就意味着宽度搜索啊。 我来试一下宽度艘多。若果能我彻底领悟A*算法。我也想用A*算法试一下。
今天突然有了灵感: 跟上次的愤怒的小鸟有什么区别呢? 如出一辙啊。 状态规划+ 状态压缩。
状态怎么压缩,初步的想法是longlong s 。
64位, 一共54张牌,完全可以状态压缩。(int 32位 Long LongLong 64位, )
五进制数,3位 ,14种牌, 需要42位, 2的42次方,超过已经超过1G了;这里被卡住了!!怎么办??
三个数组
关于状态压缩:参见:https://wenku.baidu.com/view/a7b4c4f35727a5e9846a61c0.html
预先处理下 :将能够一起出的 dp[ s | s '] = max{ dp[s|s'] , dp[s] + s }
f[s]: 记录各种出牌的情况
还没有完工,雏形。。。
#include <bits/stdc++.h>
#define debug
using namespace std;
const int MM=16777216; //2 ^ 24 至多有23张牌 不需要存储54张牌,。
int pai[14][5];
char f[MM]; //处处,哪些牌可以一次出完。
char dp[MM];
int S=0;
map map1;
int case[12]={0,2, 4,1,2,3,};
void read(){
}
void init(){
vector<int> dan;
vector<int> duizi;
vector<int> sanzhang;
vector<int>
//单张
for(int s = 0; s<=(1<<n-1); s++ ){
f[s] = 1;
}
//四张,三张
for(int i=0;i<=13;i++)
{
1 <<pai [i][1] | 1<<pai[2] | 1<<pai[i][3] | 1<<pai[i][4] & (1<<13-1)
}
]
for(int i=0;i<=13;i++)
{
int mycount=0;
for(int j=1;i<=4;j++){
if( pai[i][j] !=-1 ){
mycount++;
}
}
shu[i] = mycount;
}
void solve(){
}
int main()
{
int T;
cin>>T;
while(T--){
S=0;
memset(f,0,sizeof(S));
fill(pai, pai+13, 26;)//for
memset(dp,0,sizeof(dp));
int n; cin>>n;
for(int i=0;i<n;i++){
int a,b; cin >>a>>b;
pai[a][b]= i;
map1[i]=a;
}
#ifdef debug
cout<<" S:" << bitset<64>(S) << endl;
#endif
init();
solve();
cout << dp[S];
}
return 0;
}