哎,不是直接贴代码就是乱写,我来写个分析吧..
首先,你应该知道每个数液晶怎么显示(别说连计算器都没用过...),之后可以手推哪两个数可以相邻(这个有耐心就可以了),之后是一个递归过程,从首位开始,根据上一位的数逐个枚举可以填的数,注意:开个布尔数组判断这个数用过没有.之后全填满了就可以输出了(边界条件)。
abs是标准函数,取绝对值
cos是标准函数,余弦
sin是标准函数,正弦
ord是标准函数,取ASCII码
chr是标准函数,取ASCII码所对的字符
pred是标准函数,是取前驱
succ是标准函数,是取后继
trunc是标准函数,去掉实数的小数部分
odd好像是判断是否是奇数
**不是PASCAL基本运算符号,需要调用math库,是乘方的意思。
最后sh不好意思,我没见过,应该不是标准函数。
用错的函数有:
ord:实数没法转成所对应的ASCII码符号
odd:实数没有奇偶
sinx;应该是sin(x)
最后附PASCAL保留字:
标准常量 False Maxint True
标准类型 Boolean Char Real Integer
标准函数 Abs Arctan Chr Cos Eof Eoln Exp Ln Odd Ord Pred Round Sin Sqr Sqrt Succ Trunc
标准过程 Dispose Get New Pack Page Put Read Readln Reset Rewrite Unpack Write Writeln
标准文件 Input Output
Program Digital;
Type
Arr = Array[0..9]Of Array[1..7]Of Boolean;
Var
a, b: Arr;
c: Array[0..9]Of Integer;
f: Array[0..9]Of Boolean;
i, j, x, count: Integer;
Function check(i, j: Integer): Boolean;
Var
mode, k: Integer;
Begin
mode := 2;
check := False;
For k:=1 To 7 Do Begin
If i = 0 Then Begin
check := True;
Exit;
End;
If b[i-1][k] <> a[j][k] Then
If b[i-1][k] Then Begin
If mode = 2 Then mode := 0
Else If mode = 1 Then Exit;
End Else Begin
If mode = 2 Then mode := 1
Else If mode = 0 Then Exit;
End;
End;
check := True;
End;
Procedure Print;
Var
i: Integer;
Begin
For i:=0 To 9 Do Write(c[i]:2);
WriteLn;
Inc(count);
End;
Procedure Try(i: Integer);
Var
j: Integer;
Begin
For j:=0 To 9 Do
If f[j] And check(i, j) Then Begin
f[j] := False;
b[i] := a[j];
c[i] := j;
If i = 9 Then Print
Else Try(i+1);
f[j] := True;
End;
End;
Begin
Assign(Input, 'data.dat');
ReSet(Input);
For i:=0 To 9 Do Begin
For j:=1 To 7 Do Begin
Read(x);
If x = 1 Then a[i, j] := True Else a[i, j] := False;
End;
ReadLn;
End;
Close(Input);
Assign(Input, '');
ReSet(Input);
count := 0;
FillChar(f, SizeOf(f), True);
Try(0);
WriteLn(count);
ReadLn;
End.
QW1