指针大法好!!
看见前面大佬都用广搜,我推荐一款指针加深搜:
这一题我们可以定义一个指针数组,把能相互到达的格子的指针指向同一个地址,这样就能同时改变多个格子的到达数。
主要步骤:
int m,n,tot[100000],c[100000],d[100000];//c,d数组为 m 的横纵坐标
char ch;int *a[1001][1001];int b[1002][1002];//定义指针
for(;m>=1;m--){
cin>>c[m]>>d[m];
if(a[c[m]][d[m]]){//若指针指向的地址有数,即走过了便直接输出。
cout<<*a[c[m]][d[m]]<<endl;//就是记忆搜索
continue;
}
f(c[m],d[m]);//搜索
cout<<tot[m]<<endl;
tot=0;//记得归0
}
深搜函数:
void f(int i,int j){//深搜
a[i][j]=&tot[m];//让这个格子的指针,指向累加数;
tot[m]++;//累加答案;
for(int o=0;o<=3;o++)
if(i+x[o]>0&&i+x[o]<=n&&j+y[o]>0&&j+y[o]<=n&&!a[i+x[o]][j+y[o]])//走过的不走,不能越界
if(b[i+x[o]][j+y[o]]!=b[i][j])//题目要求
f(i+x[o],j+y[o]);//继续搜索
完整代码:
#include<bits/stdc++.h>
using namespace std;
int m,n,tot[100000],c[100000],d[100000];//c,d数组为 m 的横纵坐标
char ch;int *a[1001][1001];int b[1002][1002];//定义指针
int x[4]={1,0,-1,0};//四个方位 ;
int y[4]={0,1,0,-1};//方便对比;
void f(int i,int j){//深搜
a[i][j]=&tot[m];//让这个格子的指针,指向累加数;
tot[m]++;//累加答案;
for(int o=0;o<=3;o++)
if(i+x[o]>0&&i+x[o]<=n&&j+y[o]>0&&j+y[o]<=n&&!a[i+x[o]][j+y[o]])//走过的不走,不能越界
if(b[i+x[o]][j+y[o]]!=b[i][j])//题目要求
f(i+x[o],j+y[o]);//继续搜索
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)//输入
scanf("%1d",&b[i][j]);
for(;m>=1;m--){
cin>>c[m]>>d[m];
if(a[c[m]][d[m]]){//若指针指向的地址有数,即走过了便直接输出。
cout<<*a[c[m]][d[m]]<<endl;//就是记忆搜索
continue;
}
f(c[m],d[m]);//搜索
cout<<tot[m]<<endl;//(输出,圆满)
}
return 0;
}
这是我的博客空间,发的题解和一些洛谷技巧都在里面。
另外,本人真的只是一个弱弱的萌新,7月份才入信息组,发的题解讨论等级不高,新人可看。