这道题做的真的是心碎了,虽然最后也没有靠自己的代码AC,还是靠着别人的代码AC的
真的是太菜了
附上AC代码,(不是我自己写的)
#include <cstdio>
#include <cstring>
using namespace std;
char map[10][10],s[10][10];
int x1,y1,x2,y2,n,m;
void get_big()//获得大多连块的第一个‘*’位置
{
bool flag=true;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(s[i][j]=='*')
{
x1=i;
y1=j;
flag=false;
break;
}
}
if(!flag) break;
}
}
void get_small()//获得小多连块的第一个‘*’位置
{
bool flag=true;
for(int i=0;i<m;i++)
{
for(int j=0;j<m;j++)
{
if(map[i][j]=='*')
{
x2=i;
y2=j;
flag=false;
break;
}
}
if(!flag) break;
}
}
bool judge()//判断是否全部匹配
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(s[i][j]=='*')
return false;
return true;
}
int sovle()//匹配过程
{
get_small();
while(!judge())
{
get_big();
for(int i=x2;i<m;i++)
for(int j=0;j<m;j++)
{
if(map[i][j]=='*')
{
if(s[x1+i-x2][y1+j-y2]=='*')//关键就是这里,用小连块的位置去匹配大连块的位置
s[x1+i-x2][y1+j-y2]='.';
else
return 0;
}
}
}
return 1;
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&m)&&n&&m)
{
for(i=0;i<n;i++)
scanf("%s",s[i]);
for(j=0;j<m;j++)
scanf("%s",map[j]);
printf("%d\n",sovle());
}
return 0;
}
我自己写的我测了很多测试组,最后还是没有写出来,啊唉唉唉唉唉
太菜了
#include<iostream>
using namespace std;
#include<cstdio>
#include<cstring>
//13.46 -6
struct note
{
int d[101][2];
int num;
} b[11][11];
int point1,point2;
struct notes
{
int d[101][2];
int num;
} c[11][11];
char a[11][11];
char t[11][11];
int n,m;
bool used1[11][11];
bool used3[11][11];
bool used2[11][11];
int dd[4][2]= {{-1,0},{1,0},{0,1},{0,-1}};
inline int max(int aa,int bb)
{
return (aa<bb)?bb:aa;
}
void dfs1(int x,int y,int tempx,int tempy)
{
if(a[tempx][tempy]!='*')
return ;
for(int i=0; i<4; i++)
{
int tx=tempx+dd[i][0];
int ty=tempy+dd[i][1];
if(tx>=0&&tx<n&&ty>=0&&ty<n&&a[tx][ty]=='*'&&!used1[tx][ty])
{
b[x][y].d[b[x][y].num+1][0]=tx-x;
b[x][y].d[b[x][y].num+1][1]=ty-y;
b[x][y].num++;
used1[tx][ty]=true;
dfs1(x,y,tx,ty);
}
}
return ;
}
void dfs2(int x,int y,int tempx,int tempy)
{
if(t[tempx][tempy]!='*')
return ;
for(int i=0; i<4; i++)
{
int tx=tempx+dd[i][0];
int ty=tempy+dd[i][1];
//cout<<"ok"<<endl;
// cout<<used2[tx][ty]<<endl;
if(tx>=0&&tx<m&&ty>=0&&ty<m&&t[tx][ty]=='*'&&!used2[tx][ty])
{
c[x][y].d[c[x][y].num+1][0]=tx-x;
c[x][y].d[c[x][y].num+1][1]=ty-y;
c[x][y].num++;
//cout<<"x="<<x<<" "<<y<< c[x][y].num<<endl;
used2[tx][ty]=true;
dfs2(x,y,tx,ty);
}
}
}
bool ans=false;
struct notss
{
int num;
int d[101][2];
};
struct notss res;
int gg(int as,int bs)
{
bool uuu=false;
for(int ii=0; ii<n; ii++)
{
for(int jj=0; jj<n; jj++)
{
if(a[ii][jj]!='*')
continue;
int x=ii;
int y=jj;
bool ans=true;
for(int k=0; k<=c[as][bs].num; k++)
{
bool finds=false;
for(int i=0; i<=b[x][y].num; i++)
{
if(b[x][y].d[i][0]==c[as][bs].d[k][0]&&(b[x][y].d[i][1]==c[as][bs].d[k][1]))
{
finds=true;
break;
}
}
if(!finds)
{
ans=false;
break;
}
}
if(ans)
{
res.d[res.num+1][0]=ii;
res.d[res.num+1][1]=jj;
res.num+=1;
uuu=true;
}
}
}
if(uuu)
return 1;
return 0;
}
int f()
{
for(int i=0; i<m; i++)
{
for(int j=0; j<m; j++)
{
if(t[i][j]=='*')
{
if(gg(i,j)==0)
{
return 0;
}
else
{
return 1;
}
}
}
}
}
char temps[11][11];
int judge()
{
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(temps[i][j]=='*')
return 0;
}
// cout<<endl;
}
// cout<<endl;
return 1;
}
int fs(int start,int aim)
{
if(judge())
{
ans=true;
// cout<<"?"<<endl;
return 0;
}
for(int j=start; j<n; j++)
{
for(int k=aim; k<n; k++)
{
if(temps[j][k]=='*')
{
// cout<<"j="<<j<<" "<<"k="<<k<<" ";
temps[j][k]='.';
int tx=0,ty=0;
// cout<<point1<<" "<<point2<<endl;
// cout<<c[point1][point2].num<<endl;
for(int z=0; z<=c[point1][point2].num; z++)
{
tx=j+c[point1][point2].d[z][0];
ty=k+c[point1][point2].d[z][1];
// cout<<"tx="<<tx<<" "<<"ty="<<ty<<endl;
if(temps[tx][ty]=='*'&&tx>=0&&tx<n&&ty>=0&&ty<n)
{
temps[tx][ty]='.';
}
else
{
//cout<<"reutrn "<<endl;
return 0;
}
}
// cout<<ans<<" ++++++"<<endl;
if(judge())
{
// cout<<"??"<<endl;
ans=true;
return 0;
}
fs(0,0);
}
}
}
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("inputstr.txt","r",stdin);
// freopen("WA1102.txt","w",stdout);
#endif // ONLINE_JUDGE
while(cin>>n>>m)
{
ans=false;
if(!(n&&m))
return 0;
for(int i=0; i<n; i++)
{
cin>>a[i];
}
for(int i=0; i<m; i++)
{
cin>>t[i];
}
for(int i=0; i<11; i++)
{
for(int j=0; j<11; j++)
{
b[i][j].num=-1;
c[i][j].num=-1;
for(int k=0; k<101; k++)
{
for(int z=0; z<2; z++)
{
b[i][j].d[k][z]=0;
c[i][j].d[k][z]=0;
}
}
}
}
int gu=0;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(a[i][j]=='*')
{
gu++;
memset(used1,false,sizeof(used1));
used1[i][j]=true;
dfs1(i,j,i,j);
}
}
}
// cout<<"打印信息:"<<endl;
// for(int i=0; i<n; i++)
// {
// for(int j=0; j<n; j++)
// {
// if(a[i][j]=='*')
// {
// for(int k=0; k<=b[i][j].num; k++)
// {
// cout<<b[i][j].d[k][0]<<" "<<b[i][j].d[k][1]<<endl;
// }
// cout<<"----------"<<endl;
// }
// }
// }
// cout<<"打印成功"<<endl;
bool arr=false;
int iu=0;
for(int i=0; i<m; i++)
{
for(int j=0; j<m; j++)
{
if(t[i][j]=='*')
{
point1=i;
point2=j;
iu++;
memset(used2,false,sizeof(used2));
used2[i][j]=true;
dfs2(i,j,i,j);
if(c[point1][point2].num==-1)
{
c[point1][point2].num=0;
c[point1][point2].d[0][0]=point1;
c[point1][point2].d[0][1]=point2;
}
arr=true;
break;
}
}
if(arr)
break;
}
if(iu==1)
{
cout<<1<<endl;
continue;
}
// cout<<"打印信息:"<<endl;
// for(int i=0; i<m; i++)
// {
// for(int j=0; j<m; j++)
// {
// if(t[i][j]=='*')
// {
// for(int k=0; k<=c[i][j].num; k++)
// {
// cout<<c[i][j].d[k][0]<<" "<<c[i][j].d[k][1]<<endl;
// }
// goto loop;
// }
// }
// }
// loop:
// cout<<"打印成功"<<endl;
ans=false;
res.num=-1;
// cout<<"================"<<endl;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
temps[i][j]=a[i][j];
}
}
// cout<<"start"<<endl;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(a[i][j]=='*')
{
//cout<<ans<<" ++++++"<<endl;
// cout<<"start1"<<endl;
int ansans=fs(i,j);
// cout<<"函数="<<ansans<<endl;;
if(ans)
break;
for(int ii=0; ii<n; ii++)
{
for(int ji=0; ji<n; ji++)
{
temps[ii][ji]=a[ii][ji];
}
}
}
}
if(ans)
break;
}
cout<<ans<<endl;
}
return 0;
}