90分求助
查看原帖
90分求助
131648
GaussSheep楼主2022/6/9 10:03
  • 本人第一次做交互题,结果WA一个点,不知道怎么调试,已经干瞪眼很久了。。。
  • 恳求大佬教我怎么调试,或者指出代码错在哪 orz
  • WA的那个点
#include<iostream>
#include<cstdio>
#define N 110
#define M 4010
using namespace std;
void init();
void look(int&, bool&);
void put_sign();
void take_sign();
void walk(int);
void report(int, int);
int n,m,d,mark,fa[110],tmp[110],size[110];//回来后父亲会变成第几个点 
bool ban[110][110],si;
void dfs(int x){
	look(d,si);
	n++,m+=d,size[x]=d;
	for(int i=1;i<size[x];i++){//走了逆时针第i条路
		if(ban[x][i]){
			continue;
		}
		tmp[x]=i;
		fa[x]=size[x]-i;
		walk(i);
		look(d,si);
		put_sign();
		bool flag=0;
		walk(0);
		look(d,si);
		for(int j=x;j>1;j--){//从x层往上找标记 
			walk(fa[j]);
			look(d,si);
			if(si){
				flag=1;
				mark=j-1;
				break;
			}
		}
		walk(0);
		look(d,si);
		for(int j=(flag?mark+1:2);j<=x;j++){
			walk(tmp[j]);//走回x+1层 
			look(d,si);
		}
		take_sign();
		if(flag){
			walk(0);//走到x层 
			look(d,si);
			put_sign();
			for(int j=x;j>=mark+1;j--){
				walk(fa[j]);//走到第mark层 
				look(d,si);
			}
			for(int j=1;j<size[mark];j++){
				walk(1);
				look(d,si);
				if(si){
					ban[mark][(tmp[mark]+j)%size[mark]]=1;
					walk(0);
					look(d,si);
					walk(size[mark]-j);
					look(d,si);
					for(int j=mark+1;j<x;j++){
						walk(tmp[j]);
						look(d,si);
					}
					take_sign();
					break;
				}else walk(0);
			}
		}else{
			dfs(x+1);
			walk(0);
			look(d,si);
			walk(fa[x]);
			look(d,si);
			walk(0);//保证每次出循环都是从父亲进来的 
			look(d,si);
		}
	}
}
int main(){
	init();
	n++; 
	look(size[1],si);
	m+=size[1];
	for(int i=0,pre=0;i<size[1];i++){
		if(ban[1][i])continue;
		walk(i-pre);
		tmp[1]=i;
		dfs(2);
		walk(0);
		look(d,si);
		pre=i;
	}
	report(n,m/2);
}
2022/6/9 10:03
加载中...