2014/12/9
卡了兩天。。我一直很不解爲什麼別人dfs都能過,我bfs就tle。。。
然後,然後。。。各種優化常數。。。最後,死在了<queue>
用數組模擬就過了....
Accepted | 468K | 32MS |
這個遊戲還能愉快的玩麼。
#include<stdio.h>
#include<string.h>
//#include<queue>
using namespace std;
int vis[70000];
int ct[70000];
int pre[70000];
int prex[70000];
int prey[70000];
int rex[70000];
int rey[70000];
int q[70000];
char s[5][5];
int flag;
int Sum;
int temp[4][4]=
{
1,2,4,8,
16,32,64,128,
256,512,1024,2048,
4096,8192,16384,32768
};
int flip[4][4] = {4383, 8751, 17487, 34959, 4593, 8946, 17652, 35064, 7953, 12066, 20292, 36744, 61713, 61986, 62532, 63624};
int wk(int x,int y,int sum)
{
sum^=flip[x][y];
return sum;
}
int main()
{
while(~scanf("%s",s[0]))
{
memset(vis,0,sizeof(vis));
memset(ct,0,sizeof(ct));
for(int i =1;i < 4; i++)
scanf("%s",s[i]);
int sum = 0;
for(int i = 0;i < 4; i++)
for(int j = 0;j < 4; j++)
{
if(s[i][j]=='+')sum+=temp[i][j];
}
if(sum==0)
{
printf("0\n");
continue ;
}
ct[sum] = 0;
pre[sum] = sum;
int head= 0,fail = 1;
q[head] = sum;
int t;
while(1)
{
t = q[head++];
if(t==0)break;
for(int i = 0;i < 4; i++)
for(int j = 0;j < 4; j++)
{
int num = wk(i,j,t);
if(!vis[num])
{
vis[num] = 1;
pre[num] = t;
prex[num] = i;
prey[num] = j;
q[fail++] = num;
}
}
}
int k = 0;
while (t != sum)
{
rex[k] = prex[t];
rey[k++] = prey[t];
t = pre[t];
}
printf("%d\n", k);
for (int i = k - 1; i >= 0; --i)
printf("%d %d\n", rex[i] + 1, rey[i] + 1);
}
return 0;
}