三升序列
目前只会暴力破解,网上答案很多,也不知道哪个对,我的答案是188245。
看了一圈好像180414是对的,但是我算不出来,代码检查了许多遍,不知道哪里出问题。
#include<stdio.h>
int main(void)
{
//先把文件输入进来
char ch[30][51];
//声明一个文件指针
FILE *fp;
//调用fopen函数,返回值用声明的文件指针接收
fp=fopen("inc.txt","r");
if(fp==NULL){
printf("error");
return -1;
}
//fscanf函数把文件中的数据输入到ch数组中
for(int i=0;i<30;i++){
for(int j=0;j<51;j++){
fscanf(fp,"%c",&ch[i][j]);
}
}
//看一下接收数据后的数组
for(int i=0;i<30;i++){
for(int j=0;j<51;j++){
printf("%c",ch[i][j]);
}
}
//关闭流。如果流成功关闭,则该方法返回零。如果失败,则返回 EOF。
fclose(fp);
//i遍历行,j遍历列
//u,v,w分别是三个字符所在位置的偏移量
int i,j,u,v,w,cnt=0;
//查找所有横行里的三升序列
for(i=0;i<30;i++){
for(u=0;u<48;u++){
for(v=u+1;v<49;v++){
if(ch[i][u]<ch[i][v]){
for(w=v+1;w<50;w++){
if(ch[i][v]<ch[i][w]){
cnt++;
}
}
}
}
}
}
printf("%d\n",cnt);
//竖列
for(j=0;j<50;j++){
for(u=0;u<28;u++){
for(v=u+1;v<29;v++){
if(ch[u][j]<ch[v][j]){
for(w=v+1;w<30;w++){
if(ch[v][j]<ch[w][j]){
cnt++;
}
}
}
}
}
}
printf("%d\n",cnt);
//左下到右上
for(j=49;j>0;j--){
for(u=0;u<30&&j+u<50;u++){
for(v=u+1;v<30&&j+v<50;v++){
if(ch[29-u][j+u]<ch[29-v][j+v]){
for(w=v+1;w<30&&j+w<50;w++){
if(ch[29-v][j+v]<ch[29-w][j+w]){
cnt++;
}
}
}
}
}
}
printf("%d\n",cnt);
for(i=29;i>-1;i--){
for(u=0;i-u>-1;u++){
for(v=u+1;i-v>-1;v++){
if(ch[i-u][u]<ch[i-v][v]){
for(w=v+1;i-w>-1;w++){
if(ch[i-v][v]<ch[i-w][w]){
cnt++;
}
}
}
}
}
}
printf("%d\n",cnt);
//右上到左下
for(j=49;j>0;j--){
for(u=0;u<30&&j+u<50;u++){
for(v=u+1;v<30&&j+v<50;v++){
if(ch[29-u][j+u]>ch[29-v][j+v]){
for(w=v+1;w<30&&j+w<50;w++){
if(ch[29-v][j+v]>ch[29-w][j+w]){
cnt++;
}
}
}
}
}
}
printf("%d\n",cnt);
for(i=29;i>-1;i--){
for(u=0;i-u>-1;u++){
for(v=u+1;i-v>-1;v++){
if(ch[i-u][u]>ch[i-v][v]){
for(w=v+1;i-w>-1;w++){
if(ch[i-v][v]>ch[i-w][w]){
cnt++;
}
}
}
}
}
}
printf("%d\n",cnt);
//左上到右下
for(j=1;j<50;j++){
for(u=0;u<30&&j+u<50;u++){
for(v=u+1;v<30&&j+v<50;v++){
if(ch[u][j+u]<ch[v][j+v]){
for(w=v+1;w<30&&j+w<50;w++){
if(ch[v][j+v]<ch[w][j+w]){
cnt++;
}
}
}
}
}
}
printf("%d\n",cnt);
for(i=29;i>-1;i--){
for(u=0;u+i<30;u++){
for(v=u+1;v+i<30;v++){
if(ch[u+i][u]<ch[v+i][v]){
for(w=v+1;w+i<30;w++){//纯粹是傻逼眼瞎了,这里的w=v+1;写成了w=0;无语至极,自赏耳光吧
if(ch[v+i][v]<ch[w+i][w]){
cnt++;
}
}
}
}
}
}
printf("%d\n",cnt);
printf("%d\n",cnt);//180414
return 0;
}
用Java又做了一下,结果是对的180414,c版本出错的原因还没检查出来,先把Java代码贴上。
import java.io.File;
import java.io.FileNotFoundException;
import java.util.HashSet;
import java.util.Scanner;
//三升序列
public class Sansheng {
static int sum=0;
static char[][] t;
static HashSet<String> set;
public static void main(String[] args) throws FileNotFoundException {
set=new HashSet<>();
t=new char[30][50];
Scanner sc=new Scanner(new File("D:\\学习相关\\2020算法课\\算法练习\\inc.txt"));
for(int i=0;i<t.length;i++) {
t[i]=sc.next().toCharArray();
}
for(int i=0;i<t.length;i++) {
for(int j=0;j<t[i].length;j++) {
System.out.print(t[i][j]);
}
System.out.println();
}
count();
System.out.println(set.size());
System.out.println(sum);
}
public static void count() {
int i,j,a,b,c;
//横向
for(i=0;i<t.length;i++) {
for(a=0;a<t[i].length;a++) {
for(b=a+1;b<t[i].length;b++) {
if(t[i][a]<t[i][b]) {
for(c=b+1;c<t[i].length;c++) {
if(t[i][b]<t[i][c]) {
set.add(t[i][a]+t[i][b]+t[i][c]+"");
sum++;
}
}
}
}
}
}
//竖向
for(j=0;j<t[0].length;j++) {
for(a=0;a<t.length;a++) {
for(b=a+1;b<t.length;b++) {
if(t[a][j]<t[b][j]) {
for(c=b+1;c<t.length;c++) {
if(t[b][j]<t[c][j]) {
set.add(t[a][j]+t[b][j]+t[c][j]+"");
sum++;
}
}
}
}
}
}
//左下到右上
for(i=0;i<t.length;i++) {
for(a=0;i-a>-1;a++) {
for(b=a+1;i-b>-1;b++) {
if(t[i-a][a]<t[i-b][b]) {
for(c=b+1;i-c>-1;c++) {
if(t[i-b][b]<t[i-c][c]) {
set.add(t[i-a][a]+t[i-b][b]+t[i-c][c]+"");
sum++;
}
}
}
}
}
}
for(j=1;j<t[0].length;j++) {
for(a=0;a<t.length&&j+a<t[0].length;a++) {
for(b=a+1;b<t.length&&j+b<t[0].length;b++) {
if(t[t.length-a-1][j+a]<t[t.length-b-1][j+b]) {
for(c=b+1;c<t.length&&j+c<t[0].length;c++) {
if(t[t.length-b-1][j+b]<t[t.length-c-1][j+c]) {
set.add(t[t.length-a-1][j+a]+t[t.length-b-1][j+b]+t[t.length-c-1][j+c]+"");
sum++;
}
}
}
}
}
}
//右上到左下
for(i=0;i<t.length;i++) {
for(a=0;i-a>-1;a++) {
for(b=a+1;i-b>-1;b++) {
if(t[i-a][a]>t[i-b][b]) {
for(c=b+1;i-c>-1;c++) {
if(t[i-b][b]>t[i-c][c]) {
set.add(t[i-c][c]+t[i-b][b]+t[i-a][a]+"");
sum++;
}
}
}
}
}
}
for(j=1;j<t[0].length;j++) {
for(a=0;a<t.length&&j+a<t[0].length;a++) {
for(b=a+1;b<t.length&&j+b<t[0].length;b++) {
if(t[t.length-a-1][j+a]>t[t.length-b-1][j+b]) {
for(c=b+1;c<t.length&&j+c<t[0].length;c++) {
if(t[t.length-b-1][j+b]>t[t.length-c-1][j+c]) {
set.add(t[t.length-c-1][j+c]+t[t.length-b-1][j+b]+t[t.length-a-1][j+a]+"");
sum++;
}
}
}
}
}
}
//左上到右下
for(i=t.length-1;i>-1;i--) {
for(a=0;i+a<t.length;a++) {
for(b=a+1;i+b<t.length;b++) {
if(t[i+a][a]<t[i+b][b]) {
for(c=b+1;i+c<t.length;c++) {
if(t[i+b][b]<t[i+c][c]) {
set.add(t[i+a][a]+t[i+b][b]+t[i+c][c]+"");
sum++;
}
}
}
}
}
}
for(j=1;j<t[0].length;j++) {
for(a=0;a<t.length&&j+a<t[0].length;a++) {
for(b=a+1;b<t.length&&j+b<t[0].length;b++) {
if(t[a][j+a]<t[b][j+b]) {
for(c=b+1;c<t.length&&j+c<t[0].length;c++) {
if(t[b][j+b]<t[c][j+c]) {
set.add(t[a][j+a]+t[b][j+b]+t[c][j+c]+"");
sum++;
}
}
}
}
}
}
}
}
c版本出错原因已经找到,无他,眼瞎而已。另外,代码已更新为正确版本。