ding0 2020-02-25
在有限的二维数组范围内按行按列对每一个元素位置进行编号,此时对于编号cnt我们可以以此为bridge建立关系,方便查找:
示例代码如下:
#include<cstdio> #include<cstring> #include<iostream> using namespace std; const int maxn = 100; const int dx[]={0,0,1,-1}; const int dy[]={1,-1,0,0}; int mapper[maxn][maxn]; bool dir[maxn*maxn+5][4];//第一维度:编号,第二维度:方向编号 int id[maxn][maxn];//编号与二维坐标的对应 /*上方的对应是由坐标对应到编号,在查找时,由编号找坐标并不容易 根据需求不同,由编号找坐标的方式可以写成: int idx[maxn];//idx[编号]=x坐标 int idy[maxn];//idy[编号]=y坐标 */ int r,c; int initial_dir() { int cnt=0; for(int i=0;i<r;++i) for(int k=0;k<c;++k) { id[i][k]=cnt; for(int d=0;d<4;++d) { int newx = i+dx[d]; int newy = k+dy[d]; if(newx>=0&&newx<r&&newy>=0&&newy<c && mapper[newx][newy])dir[cnt][d]=true; else dir[cnt][d]=false; } cnt++; } return cnt;//返回总点数 } int readin() { cin>>r>>c; for(int i=0;i<r;++i) for(int k=0;k<c;++k) { cin>>mapper[i][k];//0不可行,1可行 } return 0; } int main() { ios::sync_with_stdio(false); readin(); initial_dir(); return 0; }
OK//某种意义上说这是空间换时间