2009 英特尔® 线程挑战赛 第二题 3SAT 火速发布!
第二个问题现已发布。您可以在 2009 年 5 月 8 日之前提交作品。请参见竞赛规则了解更多信息或者访问竞赛论坛寻求问题解答。祝您好运!
3SAT
问题描述:可满足性问题研究的是取值为布尔值的析取子式的合取范式组成的表达式是否为TRUE的问题。要解决这个问题,也就是使得整个表达式为TRUE,你必须首先确定一组取值为TRUE或者FALSE的布尔变量是否存在。三元可满足性(3SAT)是可满足性问题的一种,它限制了析取子式只能有3个变量。以下是3SAT表达式的一个例子:
(X_1 | !X_2 | X_3) & (X_3 | X_2 | !X_1) & (X_2 | X_1 | !X_3) & (!X_1 | !X_2 | !X_3) “|”表示逻辑“或”(OR), “&”表示逻辑“与”(AND),“!”表示逻辑“非”(NOT)。当X_1和X_2为TRUE, X_3为FALSE时,此表达式为TRUE。
写一个线程程序,首先从一个文本文件中导入3SAT问题表达式实例,然后确定是否存在使得给定表达式为TRUE的布尔值赋值。
如果存在这样一组赋值,应该把结果打印到标准输出设备,同时将布尔变量的赋值输出到一个文本文件。如果赋值不存在,输出文件会被省略。输入和输出文件名应为应用程序执行命令行的第一和第二个参数。
文件格式:输入文件的第一行将包含两个整数:表达式中布尔变量的最大数量(这里用N表示)和文件中析取子式的数量(这里用K表示)。接下来的K行将包含ABS( [ 1 ,N] )中三个整数,三个整数之间以一个空格隔开。这些整数代表布尔变量的下标,负值表示对子式中布尔变量取反。
如果存在这样一组赋值,满足整个输入的表达式的值为TRUE,那么输出文件将包含N行。每一行表示N个变量中的第几个变量以及所赋的布尔值。每行格式: [ 1 ,N]中的一个整数,一个空格,表示TRUE或FALSE的字符 “T” 或 “F”。
输入文件样例(如上述例子)
3 4
1 -2 3
3 2 -1
2 1 -3
-1 -2 -3
输出文件样例(如上述例子)
2 T
3 F
1 T
计时:总执行时间将用于计分