CCF CSP 数字点亮人生 更新
2021.4.10 明天就考CSP了,我重新复习了之前的代码思路,我才发现,我这题写的TM是什么鬼,注释都不写,根本看不懂,后面又写了一份,带了些注释,应该会好理解一点
第一份 代码短,时间长
#include<bits/stdc++.h>
using namespace std;
enum{
NOT,AND,OR,XOR,NAND,NOR
};
int M[3100][3100];
int N,m,k,T; //实际上m就是k,我懒得改了,不用在意
struct node{
int statu; //什么门
int out; //每个逻辑电路 输出值 或 输入的 值
};
node P[3100];//输入部分+逻辑电路部分
int in[3100]; //记录入度
int Tra(string s)
{
if(s=="NOT") return NOT;
if(s=="AND") return AND;
if(s=="OR") return OR;
if(s=="XOR") return XOR;
if(s=="NAND") return NAND;
if(s=="NOR") return NOR;
}
bool Judge_c()//判环
{
int sum=0;
stack<int> S;
for(int i=k+1;i<=T;i++)
if(in[i]==0)
S.push(i),sum++;
while(S.size()!=0)
{
int v=S.top();
S.pop();
for(int i=k+1;i<=T;i++)
if(M[v][i]==1)
{
in[i]--;
if(in[i]==0)
S.push(i),sum++;
}
}
if(sum==N)
return false;
else
return true;
}
void init() //同一电路下,只改变输出,每次更新输出后所用的初始化
{
for(int i=1;i<=T;i++)
P[i].out=-1;
}
void All_init() //更新电路 大初始化
{
for(int i=1;i<=T;i++)
{
P[i].out=-1;
in[i]=0;
for(int j=1;j<=T;j++)
M[i][j]=0;
}
}
int Count(string s) //计算 类似 I123 的123
{
int sum=0;
int t=1;
for(int i=s.size()-1;i>=1;i--)
sum+=(s[i]-'0')*t,t*=10;
return sum;
}
int find_ans(int num) //找到某个逻辑电路所对应的输出
{
if(P[num].out>=0)
{
return P[num].out;
}
int ans;
int w=1;
for(int i=1;i<=T;i++)
{
if(M[num][i])
{
int val=find_ans(i);
if(w) //第一次进去,直接赋值
{
ans=val;
w=0;
continue;
}
else //往后开始采用对应的操作
{
switch(P[num].statu){
case NOR:
case OR:
ans|= val;
break;
case NAND:
case AND:
ans&=val;
break;
case XOR:
ans^=val;
break;
}
}
}
}
switch