比较郁闷的一道题目,查错误查了半天,主要错误在于位运算符和!运算符的优先级,以后使用位运算尽量加括号。
搜索类题目的错误检查特别繁琐,以后使用深度较浅的例子跟踪检查。
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
#define MAXROW 105
#define MAXCOLSTATE 61
#define MAXCOL 15
#define MAXSTATE 1025
int dp[MAXCOLSTATE][MAXCOLSTATE][MAXROW];
int m,n;
int max = 0;
char map[MAXROW][MAXCOL];
int stack[MAXSTATE];
int top = 0;
void printlnBinary(int d);
int numone(int d){
int res=(d==0)?0:1;
while(d=(d&(d-1))) res++;
return res;
}
bool isokstate(int i,int row){
int j;
bool flag = true;
for(j=0;j<m;j++){
if(map[row][m-j-1]=='H' && ((i&(~(1<<j)))!=i) ) flag = false;
}
return flag;
}
int search(int i,int j,int row){
int k;int tt;
int res = 0;
int tmpres = 0;
int tmp = i | j;//合并大炮
if(dp[i][j][row] != -1) return dp[i][j][row];
if(row == 2){
res += numone(tmp);
dp[i][j][row] = res;
return res;
}else{
for(k=0;k<top;k++){
if(stack[k] & tmp) continue;
if(isokstate(stack[k],row-2)) {
//printf("n=%d state %d %d to %d/n",row,i,j,stack[k]);
if(res < (tmpres = search(j,stack[k],row-1))){
res = tmpres;
}
}
}
}
res += numone(i);
dp[i][j][row] = res;
return res;
}
bool isok(int j){
if(j<0||j>m-1) return false;
return true;
}
void printlnBinary(int d){
char ss[MAXCOL];
itoa(d,ss,2);
d = m - strlen(ss);
for(;d;d--) printf("%d",0);
printf("%s/n",ss);
}
int main(){
int i,j,k,power,temp;
bool flag;
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
scanf("%s",map[i]);
power = (int)pow(2.0,(int)m);
//同一个状态水平相邻位置不能同时放置大炮
for(i=0;i<power;i++){
flag = true;
for(j=0;j<m;j++){
if((i&~(1<<j))!=i){
if(isok(j-2)&&(i&~(1<<(j-2)))!=i){
flag = false;
break;
}
if(isok(j-1)&&(i&~(1<<(j-1)))!=i){
flag = false;
break;
}
if(isok(j+1)&&(i&~(1<<(j+1)))!=i){
flag = false;
break;
}
if(isok(j+2)&&(i&~(1<<(j+2)))!=i){
flag = false;
break;
}
}
}
if(flag)
stack[top++] = i;
}
for(i=0;i<MAXCOLSTATE;i++)
for(j=0;j<MAXCOLSTATE;j++)
for(k=0;k<MAXROW;k++)
dp[i][j][k] = -1;
for(i=0;i<top;i++)
for(j=0;j<top;j++)
{
if((!(stack[i]&stack[j]))&&isokstate(stack[i],n)&&isokstate(stack[j],n-1)){
temp = search(stack[i],stack[j],n);
if(max < temp) max = temp;
}
}
printf("%d",max);
}