16 条题解
-
1
shiru LV 8 @ 7 年前
#include<iostream>
using namespace std;
long long a[1005][1005];
int main()
{
int m,n,t=0;
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
int bian=2;
while(bian<=m&&bian<=n){
int bn=n+1-bian,bm=m+1-bian;
for(int i=1;i<=bn;i++){
for(int j=1;j<=bm;j++){
bool fan=true;
int x=i+bian-1,y=j+bian-1,midx=(x+i)/2,midy=(j+y)/2,hex=i+x,hey=j+y;
for(int p=i;p<=midx&&fan;p++){
for(int q=j;q<=midy&&fan;q++){
int duix=hex-p,duiy=hey-q;
if(a[p][q]!=a[duix][q]||a[p][q]!=a[p][duiy]||a[p][q]!=a[duix][duiy]){
fan=false;
}}
}
if(fan) t++;
else fan=true;
}
}
bian++;
}
cout<<t+n*m;
return 0;
} -
115 年前@
数据有问题
357832
357821 -
07 年前@
-
08 年前@
哪个dalao能看看爆哪里了
#include <iostream>
#include <string>
using namespace std;int n,m,w;
char a[101][101];
string b[101];//words
string d; //direction: 字母 A B C D E F G H 朝向 上 右上 右 右下 下 左下 左 左上
// 优先级顺序为D,C,B,A,H,G,F,E// 检查方向
// p - 行, q - 列, r - 需要查找的字符串位置
bool check_D(int p, int q, int r)
{
int bl=b[r].length();
if(p+bl>n+1 || q+bl>m+1)
return false;for(int i=0;i<bl;i++)
{
if(a[p+i][q+i]!=b[r][i])
return false;
}
return true;
}
bool check_C(int p, int q, int r)
{
int bl=b[r].length();
if(q+bl>m+1)
return false;for(int i=0;i<bl;i++)
{
if(a[p][q+i]!=b[r][i])
return false;
}
return true;
}
bool check_B(int p, int q, int r)
{
int bl=b[r].length();
if(p-bl<0 || q+bl>m+1)//m原为n
return false;for(int i=0;i<bl;i++)
{
if(a[p-i][q+i]!=b[r][i])
return false;
}
return true;
}
bool check_A(int p, int q, int r)
{
int bl=b[r].length();
if(p-bl<0)
return false;for(int i=0;i<bl;i++)
{
if(a[p-i][q]!=b[r][i])
return false;
}
return true;
}
bool check_H(int p, int q, int r)
{
int bl=b[r].length();
if(p-bl<0 || q-bl<0)
return false;for(int i=0;i<bl;i++)
{
if(a[p-i][q-i]!=b[r][i])
return false;
}
return true;
}
bool check_G(int p, int q, int r)
{
int bl=b[r].length();
if(q-bl<0)
return false;for(int i=0;i<bl;i++)
{
if(a[p][q-i]!=b[r][i])
return false;
}
return true;
}
bool check_F(int p, int q, int r)
{
int bl=b[r].length();
if(p+bl>n+1 || q-bl<0)
return false;for(int i=0;i<bl;i++)
{
if(a[p+i][q-i]!=b[r][i])
return false;
}
return true;
}
bool check_E(int p, int q, int r)
{
int bl=b[r].length();
if(p+bl>n+1)
return false;for(int i=0;i<bl;i++)
{
if(a[p+i][q]!=b[r][i])
return false;
}
return true;
}// 检查一个单词指定方向的全部位置
// r - 需要查找的字符串位置, d - 方向
bool check(int r, int d)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
bool t;
switch(d) {
case 'D':
t = check_D(i,j,r);
break;
case 'C':
t = check_C(i,j,r);
break;
case 'B':
t = check_B(i,j,r);
break;
case 'A':
t = check_A(i,j,r);
break;
case 'H':
t = check_H(i,j,r);
break;
case 'G':
t = check_G(i,j,r);
break;
case 'F':
t = check_F(i,j,r);
break;
case 'E':
t = check_E(i,j,r);
break; // ... 根据不同方向,调用不同的函数
}if(t)
{
cout<<i<<j<<(char)d<<endl;
return true;
}
}
}return false;
}int main()
{
cin>>n>>m>>w;
//cout<<n<<m<<w;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
//cout<<a[i][j]<<" "<<i<<j<<endl;
}
}
for(int i=1;i<=w;i++)
{
cin>>b[i];
}bool tf;
for(int k=1;k<=w;k++)
{
// ...按优先级顺序分别调用8次不同方向
if(check(k, 'D')) continue;
if(check(k, 'C')) continue;
if(check(k, 'B')) continue;
if(check(k, 'A')) continue;
if(check(k, 'H')) continue;
if(check(k, 'G')) continue;
if(check(k, 'F')) continue;
if(check(k, 'E')) continue;}
} -
08 年前@
看后立马立了个flag,果然是个flag。全爆炸,求神牛帮看,谢!
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;int n, m, ans=0;
int a[1005][1005];void searchOdd(int c, int x, int y) {
int num;
if (x+c > n || x-c < 1 || y+c > m || y-c < 1) {
return ;
}if (a[x-c][y+c] != a[x-c][y-c] || a[x-c][y-c] != a[x+c][y-c]) return ;
else {
num=a[x-c][y-c];
}
for (int i=x-c+1;i <= x+c;i++) {
if (a[i][y+c] != num || a[i][y-c] != num) {
return ;
};
}
for (int i=y-c+1;i <= y+c;i++) {
if (a[x-c][i] != num || a[x+c][i] != num) {
return ;
}
}ans++;
searchOdd(c+1, x, y);
}void searchEven(int c, int x, int y) {
int num;
if (x-c < 1 || x+1+c > n || y-c < 1 || y+1+c > m) {
return ;
}if (a[x-c][y-c] != a[x+1+c][y-c] || a[x-c][y-c] != a[x-c][y+1+c]) {
return ;
} else {
num=a[x-c][y-c];
}for (int i=x-c+1;i <= x+1+c;i++) {
if (a[i][y-c] != num || a[i][y+1+c] != num) {
return ;
}
}
for (int i=y-c+1;i <= y+1+c;i++) {
if (a[x-c][i] != num || a[x+c+1][i] != num) {
return ;
}
}ans++;
searchEven(c+1, x, y);
}int main() {
ios::sync_with_stdio(false);cin >> n >> m;
for (int i=1;i <= n;i++) {
for (int j=1;j <= m;j++) {
cin >> a[i][j];
}
}for (int i=1;i <= n;i++) {
for (int j=1;j <= m;j++) {
searchOdd(0, i, j);
searchEven(0, i, j);
}
}cout << ans;
return 0;
} -
09 年前@
-
-115 年前@
貌似数据不够猛,如果全部都一样,那么楼下几位的算法应该就。。。。
-
-115 年前@
MS预处理也可以
数据是随机的不会有很大的对称 -
-115 年前@
数奇边正方形:
1.枚举每个格
2.以该格为中心,每次加一圈得到一个更大的正方形,检验,如果不满足就枚举下一个格,否则加一圈,直到爆格
。
偶数的类似........编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 25ms
├ 测试数据 07:答案正确... 41ms
├ 测试数据 08:答案正确... 88ms
├ 测试数据 09:答案正确... 119ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:273ms -
-115 年前@
O(nm)的方法真难写,搞了近三小时。扩展KMP加上单调队列……
-
-115 年前@
首先要整明白题是什么意思。对称的正方形有两种,一种是中心是数的,另一种是中心是空的,也就是奇数长与偶数长的。之后先用几个Dp把关于每个点的各种参数求出来,比如上下方向最长对称是多少,左右是多少,关于这个点右下方的空的对称上下左右又是多少。之后对于每个点扫描两次(一次是点,一次是空),暴力循环就可以了。还有,注意细节!!很容易错的!!
这个题时限很宽,Vijos给了3s事实上我所有点总共也没用3s。
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 9ms
├ 测试数据 06:答案正确... 41ms
├ 测试数据 07:答案正确... 72ms
├ 测试数据 08:答案正确... 119ms
├ 测试数据 09:答案正确... 197ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:438ms -
-215 年前@
让大牛们一说成水题了。
我按EZ_ray大牛那样做的,不过判断时要注意
是
[]
的相等
而不是
||
这样也不是
这样。
-
-215 年前@
怀疑楼下怎么过的?
数据有错啊!
大家注意: 你算出来答案末尾是 832 的答案要减去 11 才能过! -
-215 年前@
AC!卡内存过了!
-
-215 年前@
这题不难O(∩_∩)O~
但我没过╮(╯▽╰)╭
第十个数据:答案错误。。。。。 -
-315 年前@
我是神牛!大家来膜拜我!!!!!
- 1