AT_past202005_d 题解

发布时间 2023-07-26 08:08:27作者: zhuangjihong

思路

\(4\) 列字符为一组,判断每一组,输出就可以了。

我有一个可能比较好的判断方法,就是先判断第三行——第一列一定是 .,所以我判断是都是从第二个开始,请牢记——有以下这 \(4\) 种可能:

  • #.#,这种只有一个——\(0\),直接输出 \(0\) 就可以了。

  • .#.,这种只有一个——\(1\),直接输出 \(1\) 就可以了。

  • ..#,这种只有一个——\(7\),直接输出 \(7\) 就可以了。

剩下为 ### 的就比较恶心了,具体如下:

  • 判断第四行,如果为 #..,这种只有一个——\(2\),直接输出 \(2\) 就可以了。

  • 判断第四行,如果为 ..#,这种有 \(4\) 个:

    • 判断第二行的第一个(请记住,我忽略了原本是第一个的 .),如果为 .,这种只有一个——\(3\),直接输出 \(3\) 就可以了。

    • 判断第二行的第三个,如果为 .,这种只有一个——\(5\),直接输出 \(5\) 就可以了。

    • 判断第一行的第二个,如果为 .,这种只有一个——\(4\),直接输出就可以了。

  • 其他的有 \(2\) 个:

    • 判断第二行的第三个,如果为 .,这种只有一个——\(6\),直接输出 \(6\) 就可以了。
    • 最后一个直接输出 \(9\) 就可以了。

代码

#include<iostream>
#include<cstdio>
using namespace std;
int n;
char a[6][250];
void pd()
{
	for(int i=0;i<=n*4;i+=4){
		if(a[3][i+1]=='#'&&a[3][i+2]=='#'&&a[3][i+3]=='#'){
			if(a[4][i+1]=='#'&&a[4][i+2]=='.'&&a[4][i+3]=='.') cout<<2;
			else if(a[4][i+1]=='.'&&a[4][i+2]=='.'&&a[4][i+3]=='#'){
				if(a[2][i+1]=='.') cout<<3;
				else if(a[1][i+2]=='.') cout<<4;
				else if(a[2][i+3]=='.') cout<<5;
				else cout<<9;
			}
			else{
				if(a[2][i+3]=='.') cout<<6;
				else cout<<8;
			}
		}
		else if(a[3][i+1]=='#'&&a[3][i+2]=='.'&&a[3][i+3]=='#') cout<<0;
		else if(a[3][i+1]=='.'&&a[3][i+2]=='.'&&a[3][i+3]=='#') cout<<7;
		else if(a[3][i+1]=='.'&&a[3][i+2]=='#'&&a[3][i+3]=='.') cout<<1;
	}
}
int main()
{
	cin>>n;
	for(int i=1;i<=5;i++) scanf("%s",a[i]);
	pd();
	return 0;
}

提交的时候 \(3\) 次 UKE,今晚提交了一下才 AC。