我最开始(其实是一直)用的暴搜枚举,出现了几个问题:
#include<bits/stdc++.h>
using namespace std;
int n, k;
char a[514][514];
int Count[514][514];
int xf[]
{
1, 0, -1, 0
};
int yf[]
{
0, 1, 0, -1
};
int bfs()
{
int cnt = 0;
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < k; ++j)
{
if(!(Count[i][j]) && a[i][j] == '#')
{
int xlen;
for(xlen = 0; xlen < n; ++xlen)
{
if(a[i + xlen][j] != '#' || Count[i + xlen][j])
{
break;
}
}
int ylen;
for(ylen = 0; ylen < k; ++ylen)
{
if(a[i][j + ylen] != '#' || Count[i][j + ylen])
{
break;
}
}
int x, y;
for(x = 0; x < n; ++x)
{
if(a[i + x][j + ylen - 1] != '#' || Count[i + x][j + ylen - 1])
{
break;
}
}
for(y = 0; y < k; ++y)
{
if(a[i + xlen - 1][j + y] != '#' || Count[i + xlen - 1][j + y])
{
break;
}
}
if(x != xlen || y != ylen)
{
cout << "Bad placement." /<< endl;
return 0;
}
cnt++;
for(int k = i; k < i + xlen; ++k)
{
for(int l = j; l < j + ylen; ++l)
{
Count[k][l] = 1;
}
}
}
}
}
return cnt;
}
int main()
{
cin >> n >> k;
for(int i = 0; i < n; ++i)
{
string tmp;
cin >> tmp;
for(int j = 0; j < k; ++j)
{
a[i][j] = tmp[j];
}
}
int x = bfs();
if(x)
{
cout << "There are " << x << " ships.";
}
}
经过下载数据进行研究,发现是类似于如下测试点:
3 3
###
.#.
...
与
5 5
....#
....#
....#
....#
#####
之类的数据导致的。
接着修改为:
#include<bits/stdc++.h>
using namespace std;
int n, k;
char a[114][514];
int Count[114][514];
int xf[]
{
1, 0, -1, 0
};
int yf[]
{
0, 1, 0, -1
};
int bfs()
{
int cnt = 0;
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < k; ++j)
{
if(!(Count[i][j]) && a[i][j] == '#')
{
bool b = 0;
int xlen;
for(xlen = 0; xlen < n; ++xlen)
{
if(a[i + xlen][j] != '#' || Count[i + xlen][j])
{
break;
}
}
int ylen;
for(ylen = 0; ylen < k; ++ylen)
{
if(a[i][j + ylen] != '#' || Count[i][j + ylen])
{
break;
}
}
int x, y;
for(x = 0; x < n; ++x)
{
if(a[i + x][j + ylen - 1] != '#' || Count[i + x][j + ylen - 1])
{
break;
}
}
for(y = 0; y < k; ++y)
{
if(a[i + xlen - 1][j + y] != '#' || Count[i + xlen - 1][j + y])
{
break;
}
}
if(a[i + xlen][j] == '#' || a[i][j + ylen] == '#')
{
b = 1;
}
if(x != xlen || y != ylen || b)
{
cout << "Bad placement." << endl;
return 0;
}
cnt++;
for(int k = i; k < i + xlen; ++k)
{
for(int l = j; l < j + ylen; ++l)
{
Count[k][l] = 1;
}
}
}
}
}
return cnt;
}
int main()
{
cin >> n >> k;
for(int i = 0; i < n; ++i)
{
string tmp;
cin >> tmp;
for(int j = 0; j < k; ++j)
{
a[i][j] = tmp[j];
}
}
int x = bfs();
if(x)
{
cout << "There are " << x << " ships.";
}
}
但是这样还是不够,需要把if(a[i + xlen][j] == '#' || a[i][j + ylen] == '#') { b = 1; }修改为for(int k = j; k < j + ylen; ++k) { if(a[i + xlen][k] == '#') b = 1; } for(int k = i; k < i + xlen; ++k) { if(a[k][j + ylen] == '#') b = 1; }
结果又发现数组开小了,于是把大小调成了[1145][1145]。
才总算解决了这题:
#include<bits/stdc++.h>
using namespace std;
int n, k;
char a[114][514];
int Count[114][514];
int xf[]
{
1, 0, -1, 0
};
int yf[]
{
0, 1, 0, -1
};
int bfs()
{
int cnt = 0;
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < k; ++j)
{
if(!(Count[i][j]) && a[i][j] == '#')
{
bool b = 0;
int xlen;
for(xlen = 0; xlen < n; ++xlen)
{
if(a[i + xlen][j] != '#' || Count[i + xlen][j])
{
break;
}
}
int ylen;
for(ylen = 0; ylen < k; ++ylen)
{
if(a[i][j + ylen] != '#' || Count[i][j + ylen])
{
break;
}
}
int x, y;
for(x = 0; x < n; ++x)
{
if(a[i + x][j + ylen - 1] != '#' || Count[i + x][j + ylen - 1])
{
break;
}
}
for(y = 0; y < k; ++y)
{
if(a[i + xlen - 1][j + y] != '#' || Count[i + xlen - 1][j + y])
{
break;
}
}
for(int k = j; k < j + ylen; ++k)
{
if(a[i + xlen][k] == '#') b = 1;
}
for(int k = i; k < i + xlen; ++k)
{
if(a[k][j + ylen] == '#') b = 1;
}
if(x != xlen || y != ylen || b)
{
cout << "Bad placement." /*<< i << ' ' << j << ' ' << xlen << ' ' << ylen << ' ' << x << ' ' << y*/<< endl;
return -1;
}
for(int k = i; k < i + xlen; ++k)
{
for(int l = j; l < j + ylen; ++l)
{
if(a[k][l] != '#')
{
cout << "Bad placement." << endl;
return -1;
}
Count[k][l] = 1;
}
}
cnt++;
}
}
}
return cnt;
}
int main()
{
cin >> n >> k;
for(int i = 0; i < n; ++i)
{
string tmp;
cin >> tmp;
for(int j = 0; j < k; ++j)
{
a[i][j] = tmp[j];
}
}
int x = bfs();
if(x >= 0)
{
cout << "There are " << x << " ships.";
}
}