炮兵阵地

本文探讨了在编程中遇到的位运算与逻辑运算符优先级混淆的问题,并提供了使用深度较浅的例子进行错误检查的方法。重点介绍了如何通过加括号避免误用,以及在搜索类题目中使用位操作的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

比较郁闷的一道题目,查错误查了半天,主要错误在于位运算符和!运算符的优先级,以后使用位运算尽量加括号。

搜索类题目的错误检查特别繁琐,以后使用深度较浅的例子跟踪检查。

#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);

 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值