三升序列20210314-20210413

三升序列

目前只会暴力破解,网上答案很多,也不知道哪个对,我的答案是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版本出错原因已经找到,无他,眼瞎而已。另外,代码已更新为正确版本。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值