社区讨论

萌新不会用宏定义求助

P4997不围棋参与者 6已保存回复 10

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
10 条
当前快照
1 份
快照标识符
@lobut34j
此快照首次捕获于
2023/10/30 03:18
2 年前
此快照最后确认于
2023/11/04 08:08
2 年前
查看原帖
我为了图省事,我用了
CPP
#define mp(x) mp[x.first][x.second]
#define fa(x) fa[x.first][x.second]
#define S(x) s[x.first][x.second]
提示语:
CPP
1.cpp:19:18: error: ‘std::set<std::pair<int, int> >::iterator’ has no member named ‘first’
 #define S(x) s[x.first][x.second]
                  ^
1.cpp:53:8: note: in expansion of macro ‘S’
     if(S(*it).size()==1)is=1;
        ^
1.cpp:19:27: error: ‘std::set<std::pair<int, int> >::iterator’ has no member named ‘second’
 #define S(x) s[x.first][x.second]
           
1.cpp:5:20: error: ‘std::set<std::pair<int, int> >::iterator’ has no member named ‘first’
 #define mp(x) mp[x.first][x.second]
                    ^
1.cpp:63:7: note: in expansion of macro ‘mp’
    if(mp(*it)!=(who?'X':'O')&&S(find(*it)).size()==1)is=1;
       ^
1.cpp:5:29: error: ‘std::set<std::pair<int, int> >::iterator’ has no member named ‘second’
 #define mp(x) mp[x.first][x.second]
                             ^
1.cpp:63:7: note: in expansion of macro ‘mp’
    if(mp(*it)!=(who?'X':'O')&&S(find(*it)).size()==1)is=1;
       ^

为什么编译器会认定 x 是一个迭代器?
完整代码:
CPP
#include<bits/stdc++.h>
using namespace std;
int n;
char mp[605][605];
#define mp(x) mp[x.first][x.second]
inline pair<int,int> P(int i,int j){
	return make_pair(i,j);
} 
queue<pair<int,int> >vec;
vector<pair<int,int> >q;
pair<int,int> fa[605][605];
#define fa(x) fa[x.first][x.second]
pair<int,int> find(pair<int,int> x){
	if(fa(x)==x)return x;
	return fa(x)=find(fa(x));
}
int dx[]={-1,0,0,1},dy[]={0,-1,1,0};
set<pair<int,int> >s[605][605];
#define S(x) s[x.first][x.second]
map<pair<int,int>,int>mpa[2];
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%s",mp[i]+1);
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			fa(P(i,j))=P(i,j);
			if(mp[i][j]=='.')continue;
			for(int t=0;t<4;t++){
				int x=i+dx[t],y=j+dy[t];
				if(mp[i][j]==mp[x][y])fa(find(P(i,j)))=find(P(x,y));
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(mp[i][j]=='.')continue;
			for(int t=0;t<4;t++){
				int x=i+dx[t],y=j+dy[t];
				if(mp[x][y]=='.'){
					S(find(P(i,j))).insert(P(x,y));
					S(P(x,y)).insert(find(P(i,j)));
				}
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(mp[i][j]!='.')continue;
			bool is=0;
			for(set<pair<int,int> >::iterator it=S(P(i,j)).begin();it!=S(P(i,j)).end();it++){
				if(S(*it).size()==1)is=1;
			}if(!is)vec.push(P(i,j));
		}
	}
	int who=0;
	while(!vec.empty()){
		pair<int,int> x=vec.front();vec.pop();
		if(vec.empty())while(!q.empty())vec.push(q.back()),q.pop_back();
		bool is=0;
		for(set<pair<int,int> >::iterator it=S(x).begin();it!=S(x).end();it++){
			if(mp(*it)!=(who?'X':'O')&&S(find(*it)).size()==1)is=1;
		}
		if(is){
			mpa[who][x]=1;
			if(!mpa[!who].count(x))q.push_back(x);
			continue;
		}
		printf("%d %d\n",x.first,x.second);
		if(who)mp(x)='X';
		else mp(x)='O';
		for(int t=0;t<4;t++){
			int a=x.first+dx[t],b=x.second+dy[t];
			if(mp(x)==mp[a][b]){
				S(P(a,b)).insert(S(find(x)).begin(),S(find(x)).end());
				S(find(x)).clear();
				fa(find(x))=find(P(a,b));
			}
		}
		for(set<pair<int,int> >::iterator it=S(x).begin();it!=S(x).end();it++){
			S(find(*it)).erase(x);
		}
	}
	puts("-1 -1");



	return 0;
}


回复

10 条回复,欢迎继续交流。

正在加载回复...