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;
}