如果#define x abc ,如果遇到字符串的话比如遇到xy,他会替换成abcy吗?
C++中的#define是预处理器指令,它会把所有在程序中出现的x替换为abc。如果遇到字符串"xy",它只会替换x,不会替换y。所以结果是"abc y"。
不知道你这个问题是否已经解决, 如果还没有解决的话:如果你写了那么一个程序,然后想把程序里的int和long long统一,那该怎么办(虽然这样做对程序没有影响)?是把long long全部改成int吗?可这样太麻烦了。
#include<bits/stdc++.h>
#define int long long
#define N 100001
using namespace std;
int m,n,ans,cnt=0,sum=0,li,lj,ri,rj,a[250][250];
void dg(int i,int j)
{
if(i<li) li=i;
if(j<lj) lj=j;
if(i>ri) ri=i;
if(j>rj) rj=j;
ans++;a[i][j]=0;
if(a[i][j-1]==1) dg(i,j-1);
if(a[i][j+1]==1) dg(i,j+1);
if(a[i-1][j]==1) dg(i-1,j);
if(a[i+1][j]==1) dg(i+1,j);
}
void cdr(long long n,long long m)
{
memset(a,-1,sizeof(a));
char c;
for(long long i=1;i<=n;i++)
{
for(long long j=1;j<=m;j++)
{
cin>>c;
if(c=='#') a[i][j]=1;
}
}
}
int main()
{
cin>>n>>m;
cdr(n,m);
for(long long i=1;i<=n;i++)
{
for(long long j=1;j<=m;j++)
{
if(a[i][j]==1)
{
li=ri=i;lj=rj=j;
ans=0;dg(i,j);
if((ri-li+1)*(rj-lj+1)==ans) cnt++;
else sum++;
}
}
}
cout<<cnt<<endl<<sum;
return 0;
}
其实,你只需要在函数cdr前面加一句代码就行了:
#undef int long long
加上代码后话程序就变成了这样:
#include<bits/stdc++.h>
#define int long long
#define N 100001
using namespace std;
int m,n,ans,cnt=0,sum=0,li,lj,ri,rj,a[250][250];
void dg(int i,int j)
{
if(i<li) li=i;
if(j<lj) lj=j;
if(i>ri) ri=i;
if(j>rj) rj=j;
ans++;a[i][j]=0;
if(a[i][j-1]==1) dg(i,j-1);
if(a[i][j+1]==1) dg(i,j+1);
if(a[i-1][j]==1) dg(i-1,j);
if(a[i+1][j]==1) dg(i+1,j);
}
#undef int long long
void cdr(long long n,long long m)
{
memset(a,-1,sizeof(a));
char c;
for(long long i=1;i<=n;i++)
{
for(long long j=1;j<=m;j++)
{
cin>>c;
if(c=='#') a[i][j]=1;
}
}
}
int main()
{
cin>>n>>m;
cdr(n,m);
for(long long i=1;i<=n;i++)
{
for(long long j=1;j<=m;j++)
{
if(a[i][j]==1)
{
li=ri=i;lj=rj=j;
ans=0;dg(i,j);
if((ri-li+1)*(rj-lj+1)==ans) cnt++;
else sum++;
}
}
}
cout<<cnt<<endl<<sum;
return 0;
}
这便是C/C++中的#undef指令。这样的话,这行代码后面的long long还是用long long表示,与前面的int等价。
另外,C/C++还有#ifdef,#ifndef,#elif,#if,#endif,#if……#else,#error等与宏定义有关的指令可以供您使用,但入门阶段只需要知道#define就行了。