wa了27次,终于过了
先找到通过0可以到达的最远的1的位置,答案的长度就固定了,然后对每个斜对角线进行扫描,有0就走0,否则走1
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
#include<cmath>
#include<map>
#include<queue>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1 | 1
using namespace std;
const int N=1e3+10;
int INF=0x7f7f7f7;
int T,n,m,k;
int tot[2];
const int MOD=1e9+7;
char a[N][N];
char str[N*N];
struct node{
int x,y;
};
node vec[N*N];
int num;
node q[N*N] ;
node ans[2][N];
int now;
bool vis[N][N];
bool ok;
int cnt;
int dir[]={0,1,0,-1,1,0,-1,0};
void bfs(){
memset(vis,0,sizeof vis);
num=0;
int l=0,r=0;
cnt=0;
q[r++]=node{1,1};
vis[1][1]=true;
while(l<r){
node tmp=q[l++];
int x=tmp.x,y=tmp.y;
if(x==n && y==m){
ok=true;
}
if(a[x][y]=='1'){
if(x+y>cnt){
cnt=x+y;
num=0;
vec[num++]=tmp;/*保存通过0走到的最远的1的位置*/
}else if(x+y==cnt){
vec[num++]=tmp;
}
continue;
}
for(int i=0;i<8;){
int dx=x+dir[i++];
int dy=y+dir[i++];
if(dx<1 || dx>n || dy<1 || dy>m || vis[dx][dy]) continue;
q[r++]=node{dx,dy};
vis[dx][dy]=true;
}
}
}
void solve(){
if(num==0){
puts("0");
return;
}
int len=n+m-cnt+1;/*答案的长度是已知的*/
str[0]='1';
str[len]='\0';
int step=0;
memset(vis,0,sizeof vis);
for(int i=0;i<len-1;i++){/*斜对角线扫描*/
tot[0]=tot[1]=0;/*保存下一个斜线中0和1的个数*/
for(int j=0;j<num;j++){
node u=vec[j];
int x=u.x,y=u.y;
if(x+1<=n && !vis[x+1][y]){
vis[x+1][y]=true;
if(a[x+1][y]=='0') ans[0][tot[0]++]=node{x+1,y};
else ans[1][tot[1]++]=node{x+1,y};
}
if(y+1<=m && !vis[x][y+1]){
vis[x][y+1]=true;
if(a[x][y+1]=='0') ans[0][tot[0]++]=node{x,y+1};
else ans[1][tot[1]++]=node{x,y+1};
}
}
if(tot[0]){ /*有0 一定是走0的位置*/
str[++step]='0';
num=tot[0];
for(int j=0;j<tot[0];j++) vec[j]=ans[0][j];
}else{ /*否则就走1*/
str[++step]='1';
num=tot[1];
for(int j=0;j<tot[1];j++) vec[j]=ans[1][j];
}
}
printf("%s\n",str);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("aaa","r",stdin);
#endif
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%s",a[i]+1);
ok=false;
bfs();
if(ok) printf("%c\n",a[n][m]); /*如果可以通过0走到终点,就输出最后的一个字符*/
else solve();
}
return 0;
}