解药还是毒药(codevs 2594)
二进制、哈希判重加广搜
#include<cstdio> #include<iostream> #define M 1100 using namespace std; struct node { int f[M];//病人的状态 int dep;//步骤数 };node q[M]; int a[M][M],num[M],hash[M],n,m,head,tail,sum,flag; void bfs() { while(head<=tail) { for(int i=1;i<=n;i++) { int tot=0; tail++;tot=0; for(int j=1;j<=m;j++) { if(a[i][j]==1)q[tail].f[j]=1; else if(a[i][j]==0)q[tail].f[j]=q[head].f[j]; else q[tail].f[j]=0; if(q[tail].f[j]==1) tot+=num[j]; } if(!hash[tot]) { hash[tot]=1; q[tail].dep=q[head].dep+1; if(tot==sum) { printf("%d",q[tail].dep); flag=1; return; } } else tail--; } head++; } } void init() { num[1]=2; sum=2; for(int i=2;i<=m;i++) num[i]=num[i-1]*2, sum+=num[i]; } int main() { scanf("%d%d",&m,&n); init(); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&a[i][j]); bfs(); if(!flag)printf("The patient will be dead."); return 0; }