第一次做CF,,,虽然是补番的,感觉CF做的比国内的OJ成熟,怎么说。。更好用,,除了比赛时间都是大晚上这样的><
ABC就不说了,都是水题,,,不过每次做水题都会感叹自己太急躁,不够细心。。。。。
D题看到第一眼就想用匈牙利做二分匹配。怪自己大意,不把2000*2000当回事,到后面判重的时候真的非常艰难。。。所以测试数据只能过一半,剩下的就T掉了。
看了别人的代码(这一点很喜欢,貌似所有的题都能看到代码和数据(重点))。看到大牛代码那么短真的要泪奔了。。。方法很巧,如果自己重新想不知道能不能想得到这种方法。
现在觉得C++真的很好用,决定深入学习。。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <queue>
using namespace std;
#define maxn 2010
typedef pair<int, int> pii;
char map[maxn][maxn];
int n,m;
int ind[maxn][maxn];
char dir[4]={'>','<','v','^'};
int cmpx[4]={0,0,1,-1};
int cmpy[4]={1,-1,0,0};
int check(int x,int y)
{
if(map[x][y]=='*'||x<0||x>=n||y<0||y>=m) return 0;
return 1;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
int i,j,k;
queue<pii> que;
memset(ind,0,sizeof(ind));
getchar();
for(i=0;i<n;i++) {gets(map[i]);}
// cout<<"*********"<<endl;for(i=0;i<n;i++) {for(j=0;j<m;j++) printf("%c",map[i][j]);printf("\n");}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(map[i][j]=='*') continue;
for(k=0;k<4;k++)
{
int xx=i+cmpx[k],yy=j+cmpy[k];
if(check(xx,yy))
{
// printf("map[][]=%c\n",map[xx][yy]);
ind[i][j]++;//printf("xx=%d yy=%d\n",xx,yy);
}
}
// printf("ind[%d][%d]=%d\n",i,j,ind[i][j]);
if(ind[i][j]==1) que.push(pii(i,j));
}
}
while(!que.empty())
{
i=que.front().first;
j=que.front().second;
// printf("[%d][%d]\n",i,j);
que.pop();
for(k=0;k<4;k++)
{
int xx=i+cmpx[k],yy=j+cmpy[k];
if(map[xx][yy]=='.'&&check(xx,yy))
{
ind[xx][yy]=ind[i][j]=0;
map[xx][yy]=dir[k];
map[i][j]=dir[k^1];
for(int p=0;p<4;p++)
{
int ii=xx+cmpx[p],jj=yy+cmpy[p];
if(map[ii][jj]=='.'&&check(xx,yy))
{
if(ind[ii][jj]) ind[ii][jj]--;
if(ind[ii][jj]==1)
que.push(pii(ii,jj));
}
}
break;}
}
}
// for(i=0;i<n;i++) {for(j=0;j<m;j++) printf("%c",map[i][j]);printf("\n");}
k=0;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
if(map[i][j]=='.') {k=1;break;}
if(k) break;
}
if(k) {printf("Not unique\n");continue;}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
printf("%c",map[i][j]);
printf("\n");
}
}
return 0;
}