暴力搜索对比,就好了。
时间复杂度O(n2S2),离谱子,这样居然都没超时。
因为S左下角一定是1,那么就遍历L中所有点,尝试L中每个点是不是都可以作为S左下角:
break;
(使用了一个for循环)f()
函数)最后统计被标记为true
的点的个数。
#include
using namespace std;
int n,L,S;
int a[52][52];
class point {public:int x,y;bool c;point() {c=false;//记录该点是否为藏宝点}
};
point b[1005];bool f(int x,int y){//判断在图L中坐标为 x y的点是1 还是0for(int i=0;iif(b[i].x==x and b[i].y==y)return 1;}return 0;
}int main() {cin>>n>>L>>S;S++;for(int i=0; i>b[i].x>>b[i].y;for(int i=0; ifor(int j=0; jcin>>a[i][j];}}for(int k=0; k//尝试L中每个点是不是都可以作为S左下角bool sign=true;for(int i=0; ifor(int j=0; jif(b[k].x+i<=L&&b[k].y+j<=L&&//图S重合度不能超过L范围f(b[k].x+i,b[k].y+j)==a[S-i-1][j]) {//相同坐标 值相同} else {sign=false;//不同直接breakbreak;}}if(!sign)break;}if(sign) {//相同b[k].c=true;//记录该点可以}}int ans=0;for(int i=0; iif(b[i].c==true)ans++;//统计}cout<