萌新求助搜索,wa60pts对拍无果
查看原帖
萌新求助搜索,wa60pts对拍无果
663681
C_liar楼主2022/10/2 09:36

rt.

wa后四个点,看不明白

Wrong Answer.wrong output format Expected EOLN

是什么意思

我的代码:(2578.cpp)

思路是康拓展开判重,在扩展时记录一个pre,输出方案。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<iostream>
#include<queue>
#include<unordered_map>
#include<stack>
typedef long long ll;
const int _=362880+10;
using namespace std;

const string Tag="012345678";
string Trans_str(int Map[3][3]){
	string s="";
	for(int i=0;i<3;i++) for(int j=0;j<3;j++){
		s=s+char(Map[i][j]+'0');
	}
	return s;
}
int Map[3][3];
void Trans_map(const string& s){
	int it=0;
	for(int i=0;i<3;i++) for(int j=0;j<3;j++){
		Map[i][j]=s[it++]-'0';
	}
}

class Bit{
protected:
	int c[10];
	int l(int x){return x&-x;}
public:
	Bit(){memset(c,0,sizeof c);}
	void add(int x,int d){for(;x<=9;x+=l(x))c[x]+=d;}
	int ask(int x){int A=0;for(;x;x-=l(x))A+=c[x];return A;}
};

int fac[10];

void Fact_pre(){
	fac[0]=1;
	for(int i=1;i<=9;i++) fac[i]=i*fac[i-1];
}

int Cantor(const string& s){
	Bit t;
	for(int i=1;i<=9;i++) t.add(i,1);
	int ans=0;
	for(int i=0;i<9;i++){
		t.add(s[i]-'0'+1,-1);
		int x=t.ask(s[i]-'0'+1);
		ans+=x*fac[8-i];
	}
	return ans+1;
}

int pre[_];
bool vis[_];
unordered_map<int,string> mp;

int main(){
	freopen("P2578.in","r",stdin);
	freopen("P2578.out","w",stdout);
	int Tmp[3][3];
	Fact_pre();
	for(int i=0;i<3;i++) for(int j=0;j<3;j++) scanf("%d",&Tmp[i][j]);
	queue<pair<string,int> > q;
	q.push(make_pair(Trans_str(Tmp),0));
	mp[1]=Tag;
	while(q.size()){
		string x=q.front().first;
		int step=q.front().second;q.pop();
		int val=Cantor(x);
		if(vis[val]) continue;
		if(val==1){
			printf("%d\n",step);
			stack<int> s;
			while(val) s.push(val),val=pre[val];
			while(s.size()){
				int TmpVal=s.top();s.pop();
				Trans_map(mp[TmpVal]);
				for(int i=0;i<3;i++) for(int j=0;j<3;j++){
					printf("%d ",Map[i][j]);
					if(j==2) puts("");
				}
				if(s.size()) puts("");
			}
			return 0;
		}
		vis[val]=1;
		mp[val]=x;
		Trans_map(x);
		for(int i=0;i<3;i++) for(int j=0;j<3;j++){
			Tmp[i][j]=Map[i][j];
		}
		Map[0][0]=Tmp[1][0];
		Map[0][1]=Tmp[0][0];
		Map[0][2]=Tmp[0][1];
		Map[1][2]=Tmp[0][2];
		Map[2][2]=Tmp[1][2];
		Map[2][1]=Tmp[2][2];
		Map[2][0]=Tmp[2][1];
		Map[1][0]=Tmp[2][0];
		string New=Trans_str(Map);
		int Val=Cantor(New);
		if(!vis[Val]){
			pre[Val]=val;
			q.push(make_pair(New,step+1));
		}
		for(int i=0;i<3;i++) Map[1][i]=Tmp[1][i];
		Tmp[1][0]=Map[1][2];
		Tmp[1][1]=Map[1][0];
		Tmp[1][2]=Map[1][1];
		New=Trans_str(Tmp);
		Val=Cantor(New);
		if(!vis[Val]){
			pre[Val]=val;
			q.push(make_pair(New,step+1));
		}
	}
	puts("UNSOLVABLE");
	return 0;
}

找的第一篇题解对拍。

maker:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<random>
#include<ctime>
using namespace std;

int main(){
	freopen("P2578.in","w",stdout);
	srand(time(0));
	int a[10];
	for(int i=1;i<=9;i++) a[i]=i-1;
	random_shuffle(a+1,a+10);
	for(int i=1;i<=9;i++) printf("%d ",a[i]);
	return 0;
}

写的spj,用0代表错,1代表对。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
typedef long long ll;
const int _=+10;
using namespace std;

int cnta,cntb;
int State[36][4][4];

void move1(int a[4][4]){
    int tmp=a[1][1];
    a[1][1]=a[2][1],a[2][1]=a[3][1],a[3][1]=a[3][2];
    a[3][2]=a[3][3],a[3][3]=a[2][3],a[2][3]=a[1][3],a[1][3]=a[1][2],a[1][2]=tmp;
}
void move2(int a[4][4]){
    int tmp=a[2][3];
    a[2][3]=a[2][2],a[2][2]=a[2][1],a[2][1]=tmp;
}

int judge(){
	int Tmp[2][4][4];
	for(int T=1;T<cnta;T++){
		for(int i=1;i<=3;i++) for(int j=1;j<=3;j++){
			Tmp[0][i][j]=Tmp[1][i][j]=State[T][i][j];
		}
		move1(Tmp[0]);
		move2(Tmp[1]);
		int cnt=0;
		for(int S=0;S<=1;S++){
			bool Flag=1;
			for(int i=1;i<=3;i++) for(int j=1;j<=3;j++){
				if(Tmp[S][i][j]!=State[T+1][i][j]){Flag=0;break;}
			}
			if(Flag==1) cnt++;
		}
		if(!cnt) printf("0\nWrong Answer on State %d.",T),exit(0);
	}
	return 1;
}

int main(){
	freopen("P2578.out","r",stdin);
	scanf("%d",&cnta);
	for(int i=1;i<=cnta;i++){
		for(int j=1;j<=3;j++) for(int k=1;k<=3;k++){
			scanf("%d",&State[i][j][k]);
		} 
	}
	freopen("P2578_judgeA.txt","w",stdout);
	int tmp=judge();
	freopen("P2578.ans","r",stdin);
	scanf("%d",&cntb);
	printf("%d",tmp&&(cnta==cntb));
	return 0;
}

checker:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
typedef long long ll;
const int _=+10;
using namespace std;

int main(){
	int tmp=0;
	for(int i=1;i;i++){
		system("2578_maker.exe");
		system("2578_ans.exe");
		system("2578.exe");
		system("2578_spj.exe");
		freopen("P2578_judgeA.txt","r",stdin);
		if(scanf("%d",&tmp)&&!tmp) break;
		printf("Case#%d, Accepted.\n",i);
	}
	return 0;
}
2022/10/2 09:36
加载中...