BUG修复

#include<cstdio>
#include<memory.h>
using namespace std;
#define N 15
#define M 100

int sum[(1<<N)-1];
struct node{
    int status;
    node* next;
};
struct Patch{
       int time;
       char B[N];
       char F[N];
}patch[M];

void addStatusNode(node* head, int _status){
     node* p = head;
     node* pre = p;
     node* temp = NULL;
     while(p != NULL && sum[p->status] < sum[_status]) {
             pre = p;
             p = p->next;
     }
     temp = new node;
     temp->status = _status;
     pre->next = temp;
     temp->next = p;
}

int main(){
    int n,m;
    char s1[N],s2[N];
    memset(sum,-1,sizeof(sum));
    scanf("%d%d", &n, &m);
    for(int i = 0; i < m; i++){
        scanf("%d%s%s", &patch[i].time, &patch[i].B, &patch[i].F);
    }
   
    int max = (1<<n)-1;
    node* p = new node;
    p->status = max;
    p->next = NULL;
    sum[max] = 0;   
    
    node* head = p;    
    while(head != NULL){
            int now = head->status;
            if(now == 0){
                    printf("%d\n", sum[0]);
                    break;
            }
            for(int i = 0; i < m; i++){
                bool flag = false;
                for(int j = 0; j < n; j++)
                    if( patch[i].B[j]=='+' && !(now&(1<<j)) ||
                        patch[i].B[j]=='-' && now&(1<<j) ) {
                        flag = true;
                        break;    
                    }
                if(flag) continue;
                int status = now;
                
                for(int j = 0; j < n; j++){
                    if(patch[i].F[j] == '+') status |= (1<<j);
                    else if(patch[i].F[j] == '-') status &= (max-(1<<j));
                }
                
                if(sum[status] == -1 || sum[status] > sum[now] + patch[i].time){
                    sum[status] = sum[now] + patch[i].time;
                    addStatusNode(head, status);
                }
            }//end i           
            p = head;
            head = head->next;
            delete p;
    } //end while
    if(head == NULL)printf("0\n");
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值