[uva] 225 - 골리곤스(dfs 구덩이)
난이도가 별로 없는 것 같아요.
이것은 TEL의 BFS 코드입니다.
13970312
225
Golygons
Time limit exceeded
C++
3.000
2014-07-31 09:42:55
#include <vector>
#include <list>
#include <map>
#include <string>
#include <set>
#include <cstring>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
#define MAXD 1000
#define LEN 300
int n;
int Map[MAXD][MAXD] = {0};
int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}}; /* , , , */
int dir_[2][2][2] = {{{0,1},{0,-1}},{{1,0},{-1,0}}};
char const _dir[] = "ewns";
/*0 1 2 3 , , , */
struct State{
vector<int>rote; /* */
int now_dir; /* */
int step; /* */
int x,y; /* */
};
bool can_move(int from_x,int from_y,int to_x,int to_y){
/* (from_x,from_y) (to_x,to_y) */
if(from_x == to_x){
int t1 = min(from_y,to_y);
int t2 = max(from_y,to_y);
for(int i = t1 ; i <= t2 ; i++){
if(Map[to_x][i])
return false;
}
}
else if(from_y == to_y){
int t1 = min(from_x,to_x);
int t2 = max(from_x,to_x);
for(int i = t1 ; i <= t2 ; i++){
if(Map[i][to_y])
return false;
}
}
return true;
}
void bfs(){
queue<State>q;
for(int i = 0 ; i < 4 ; i++){ /* */
int _x = LEN + dir[i][0];
int _y = LEN + dir[i][1];
if(!Map[_x][_y]){ /* */
State start;
start.rote.push_back(i);
start.step = 2;
start.now_dir = i;
start.x = _x;
start.y = _y;
q.push(start);
}
}
int cnt = 0;
while(!q.empty()){
State s = q.front(); q.pop();
if(s.step == n + 1){
cnt ++;
for(int i = 0 ; i < s.rote.size(); i++)
printf("%c",_dir[s.rote[i]]);
printf("
");
continue;
}
int k;
int step = s.step;
if(s.now_dir == 0 || s.now_dir == 1)
k = 0;
else
k = 1;
for(int i = 0; i < 2 ; i++){ /* 90 */
int _x = s.x + step * dir_[k][i][0];
int _y = s.y + step * dir_[k][i][1];
if(can_move(s.x,s.y,_x,_y)){
State temp = s;
temp.x = _x; temp.y = _y;
temp.step = step + 1;
if(k == 0){ /* */
if(i == 0){
temp.rote.push_back(2);
temp.now_dir = 2;
}
else
if(i == 1) { /* */
temp.rote.push_back(3);
temp.now_dir = 3;
}
}
else if(k == 1){
if(i == 0){ /* */
temp.rote.push_back(0);
temp.now_dir = 0;
}
else
if(i == 1){ /* */
temp.rote.push_back(1);
temp.now_dir = 1;
}
}
if(step == n &&(_x != LEN ||_y != LEN)) continue;
else
q.push(temp);
}
}
}
printf("Found %d golygon(s).
",cnt);
}
int main(){
int T;
scanf("%d",&T);
while(T--){
int m;
scanf("%d%d",&n,&m);
memset(Map,0,sizeof(Map));
for(int i = 0 ; i < m ; i++){
int x , y;
scanf("%d%d",&x,&y);
Map[LEN + x][LEN + y] = 1;
}
bfs();
printf("
");
}
return 0;
}
이것은 AC의 DFS 코드로 서로 다른 상황에서 DFS와 BFS를 사용하는 계산 시간의 차이가 매우 크다는 것을 알 수 있다.
13970729
225
Golygons
Accepted
C++
2.239
2014-07-31 10:49:47
#include <vector>
#include <list>
#include <map>
#include <string>
#include <set>
#include <cstring>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
#define MAXD 1000
#define LEN 500
int n,cnt;
int Map[MAXD][MAXD];
int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}}; /* , , , */
int dir_[2][2][2] = {{{0,1},{0,-1}},{{1,0},{-1,0}}};
char const _dir[] = "ewns";
int _vis[50] = {0};
/*0 1 2 3 , , , */
int rote[MAXD]; /* */
int vis[MAXD][MAXD];
struct Dir{
char str[MAXD];
friend bool operator < (Dir p,Dir q){
if(strcmp(p.str,q.str) < 0)
return true;
else
return false;
}
}ans[200L];
void biao(){
_vis[1] = 1; _vis[2] = 1; _vis[3] = 1; _vis[4] = 1;
_vis[5] = 1; _vis[6] = 1; _vis[9] = 1; _vis[10] = 1;
_vis[11] = 1; _vis[12] = 1; _vis[13] = 1; _vis[14] = 1;
_vis[17] = 1; _vis[18] = 1; _vis[19] = 1; _vis[20] = 1;
}
bool can_move(int from_x,int from_y,int to_x,int to_y){
/* (from_x,from_y) (to_x,to_y) */
if(from_x == to_x){
int t1 = min(from_y,to_y);
int t2 = max(from_y,to_y);
for(int i = t1 ; i <= t2 ; i++){
if(Map[to_x][i])
return false;
}
}
else if(from_y == to_y){
int t1 = min(from_x,to_x);
int t2 = max(from_x,to_x);
for(int i = t1 ; i <= t2 ; i++){
if(Map[i][to_y])
return false;
}
}
return true;
}
void dfs(int step,int dir,int x,int y){ /* , , */
vis[x][y] = 1;
if(step == n && x == LEN && y == LEN){
for(int i = 0 ; i < step ; i++)
ans[cnt].str[i] = _dir[rote[i]];
ans[cnt].str[step] = '\0';
cnt ++;
return ;
}
else if(step == n)
return ;
int k;
if(dir == 0 || dir == 1)
k = 0;
else
k = 1;
for(int i = 0; i < 2 ; i++){ /* 90 */
int _x = x + (step + 1) * dir_[k][i][0];
int _y = y + (step + 1) * dir_[k][i][1];
if(!vis[_x][_y] && can_move(x,y,_x,_y)){
if(k == 0){ /* */
if(i == 0){
rote[step] = 2;
dfs(step + 1,2,_x,_y);
}
else
if(i == 1) { /* */
rote[step] = 3;
dfs(step + 1,3,_x,_y);
}
}
else if(k == 1){
if(i == 0){ /* */
rote[step] = 0;
dfs(step + 1,0,_x,_y);
}
else
if(i == 1){ /* */
rote[step] = 1;
dfs(step + 1,1,_x,_y);
}
}
vis[_x][_y] = 0;
}
}
return ;
}
int main(){
int T;
scanf("%d",&T);
biao();
while(T--){
int m;
cnt = 0;
scanf("%d%d",&n,&m);
memset(Map,0,sizeof(Map));
for(int i = 0 ; i < m ; i++){
int x , y;
scanf("%d%d",&x,&y);
Map[LEN + x][LEN + y] = 1;
}
if(!_vis[n]){
for(int i = 0 ; i < 4 ; i++){
int x = LEN + 1 * dir[i][0];
int y = LEN + 1 * dir[i][1];
memset(vis,0,sizeof(vis));
rote[0] = i;
dfs(1,i,x,y);
}
sort(ans,ans + cnt);
for(int i = 0 ; i < cnt ; i++)
printf("%s
",ans[i].str);
}
printf("Found %d golygon(s).
",cnt);
printf("
");
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.