题目大意:

不读了,我猜是数独。这种应用型程序肯定是谁写的越快谁越nb啊,而且对于不同的数据,跑的时间应该会相差很多。好多0ms的不知道是怎么剪枝的。

从左上角向右下角枚举所有的点的代码(485ms):

#include<iostream>
#include<math.h>
#include<string.h>

using namespace std;

struct point
{
	int x;
	int y;
	int a[10];
	int n;
	point()
	{
		n=0;
	}
};
int n=0;
point p[100];
int map[10][10]={0};
bool flag=0;
void ceshi()
{
	for(int i=1;i<n;i++)
	{
		cout<<p[i].x<<" "<<p[i].y<<endl;
	}
}
void output()
{
	for(int i=1;i<10;i++)
	{
		for(int j=1;j<10;j++)
		{
			cout<<map[i][j];
		}
		cout<<endl;
	}
}
void check(int x)
{
	p[x].n=0;
	int l[10]={0};
	for(int i=1;i<10;i++)
	{
		l[map[p[x].x][i]]=1;
		l[map[i][p[x].y]]=1;
	}
	int tx=(p[x].x-1)/3;
	int ty=(p[x].y-1)/3;
	tx*=3;
	ty*=3;
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			l[map[tx+i][ty+j]]=1;
		}
	}
	for(int i=1;i<10;i++)
	{
		if(l[i]==0)
		{
			p[x].a[p[x].n]=i;
			p[x].n++;
		}
	}
	return;
}
void dfs(int x)//枚举x号点的所有可能值
{
	if(x==n+1)
	{
		output();
		cout<<endl;
		flag=1;
		return;
	}
	check(x);
	for(int i=0;i<p[x].n;i++)
	{
		map[p[x].x][p[x].y]=p[x].a[i];
		//cout<<"x:"<<x<<" i:"<<i<<" "<<p[x].a[i]<<" "<<endl;
		dfs(x+1);
		if(flag==1)return;
		map[p[x].x][p[x].y]=0;
	}
	
}

int main()
{
	int test;
	cin>>test;
	while(test--)
	{
		flag=0;
		n=0;
		for(int i=1;i<10;i++)
		{
			for(int j=1;j<10;j++)
			{
				char l;
				cin>>l;
				map[i][j]=(int)l-'0';
				if(map[i][j]!=0)continue;
				n++;
				p[n].x=i;
				p[n].y=j;
			}
		}
		//output();
		//ceshi();
		dfs(1);
		memset(map,0,sizeof(map));
	}
	
	
}

改成从右下角向左上角枚举,变成0ms。不会真的要理解出题人意图吧。。。。