Problem K : Treasure Map
From: DHUOJ, 2017060311
(Out of Contest)
然后我就按照最简单的蛇形填数来做了,测试数据都过了呀,亲,然后就是超时超时超时~~~~~TLE TLE TLE 0.0
附上超市的代码:
#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int a[111][111];
int main()
{
int n,m,count,x,y,b[10001];
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1; i<=n*m; i++)
{
scanf("%d",&b[i]);
}
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
a[i][j]=0;
a[x=0][y=0]=b[1];
count = 1;
while(count<n*m)
{
while(y+1<m &&!a[x][y+1]) a[x][++y] =b[++count];
while(x-1>=0 &&!a[x-1][y]) a[--x][y]=b[++count];
while(y-1>=0 &&!a[x][y-1]) a[x][--y]=b[++count];
while(x+1<n && !a[x+1][y]) a[++x][y]=b[++count];
}
for(x=0; x<n; x++)
{
for(y=0; y<m; y++)
{
if(y==m-1)
printf("%d",a[x][y]);
else
printf("%d ",a[x][y]);
}
printf("\n");
}
}
}
不知道为啥超时呀,感觉基本原理都是这样的。。。。。
然后dalao AC的代码在此:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn = 102;
int N,M;
int Map[maxn][maxn];
int a[maxn*maxn];
int main()
{
int up,down,left,right; ///分别记录上边界,下边界,左边界,右边界
while(~scanf("%d%d",&N,&M))
{
for(int i = 1; i <= N*M; i++)
scanf("%d",&a[i]);
up = 0;
down = N+1;
left = 0;
right = M+1;
int ccount = 1;
while(1)
{
///先向右填数
if(up+1<down) ///必须要判断,上下边界相邻,不能填数了。同理左右边界相邻也不能填数了。
{
for(int i = left+1; i<right; i++)
{
Map[up+1][i] = a[ccount++];
}
up++;
}
else break;
///然后往下走
if(left<right-1)
{
for(int i = up+1; i < down; i++)
{
Map[i][right-1] = a[ccount++];
}
right--;
}
else break;
///然后往左走
if(up<down-1)
{
for(int i = right-1; i > left; i--)
{
Map[down-1][i] = a[ccount++];
}
down--;
}
else break;
///然后往上走
if(left+1<right)
{
for(int i = down-1; i > up; i--)
{
Map[i][left+1] = a[ccount++];
}
left++;
}
else break;
}
for(int i = 1; i <= N; i++)
{
for(int j = 1; j <= M; j++)
{
if(j == 1) printf("%d",Map[i][j]);
else printf(" %d",Map[i][j]);
}
printf("\n");
}
}
return 0;
}