HDOJ水题集合6:杂题

1001

求全排列(1)
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 33 Accepted Submission(s) : 16
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
输入一个正整数n, 请按照字典序输出1-n的全排列。

Input
输入包含多组测试用例。
每组数据占一行,包含一个正整数n(n<10)。
Output
每个排列输出一行,每个数字后面跟一个空格。
具体格式参加样例的输出。
Sample Input
3
2
Sample Output
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
1 2
2 1

#include<iostream>
using namespace std;
int n, c[20];
void dfs(int cur){
    if(cur == n){
        for(int i = 0; i < n; i++)cout<<c[i]<<" ";
        cout<<"\n";
    }else for(int i = 1; i <= n; i++){
        int ok = 1;
        for(int j = 0; j < cur; j++)
            if(c[j]==i)ok = 0;
        if(ok){
            c[cur] = i;
            dfs(cur+1);
        }
    }
}
int main(){
    while(cin>>n)dfs(0);
    return 0;
}

1002

手机的诱惑
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 50 Accepted Submission(s) : 18
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
张晨乐在一个古老的迷宫中发现了一个手机,这个手机深深地吸引了他。

然而,当他拾起手机,迷宫开始摇晃,张晨乐能感觉到地面下沉。他意识到:这个手机只是一个诱饵!于是,他不顾一切地试图冲出这个迷宫。

迷宫是一个大小为N*M的矩形,有一扇门,一开始,门是关闭的,并在第T秒打开一瞬间(小于1秒的时间)。因此,张晨乐必须刚好在第T秒钟到达门口。
每一秒,他都可以向上,下,左,右四个相邻的位置中的任意一个移动。一旦他进入一个新的地方,这个地方的地面就会开始下沉,并在下一秒消失。因此,他不能在一个地方停留超过一秒钟,也不能再进入曾经走过的地方。

请问,可怜的张晨乐能够逃出迷宫吗?
Input
输入由多个测试用例组成。
每个测试用例的第一行包含三个整数N,M和T(1 <N,M <7; 0 <T <50),分别表示迷宫的大小和门打开的时间。
接下来的N行给出迷宫布局,每行包含M个字符。

每个字符含义如下:

‘X’:不能进入的墙
‘S’:起点
‘D’:门
‘.’:可以行走的地方

输入以三个0结束,这个测试用例不被处理。

Output
对于每组测试数据,如果张晨乐能够逃出迷宫,则请输出“YES”,否则,请输出“NO”。每组数据输出占一行。
Sample Input
4 4 5
S.X.
…X.
…XD

3 4 5
S.X.
…X.
…D
0 0 0
Sample Output
NO
YES

  • 不能广搜的原因:考虑1->2,1->3后vis[2,3]==1,所以2->3不能走了
#include<bits/stdc++.h>
using namespace std;

char a[20][20];
int vis[20][20];
int dx[] = {0,0,-1,1};
int dy[] = {1,-1,0,0};

int n, m, T;
int sx, sy, ex, ey, ok;
void dfs(int x, int y, int step){
	if(x==ex&&y==ey&&step==T){ok=1; return ;}
	if(step>T || ok==1)return ;
	if(abs(T-step-abs(x-ex)-abs(y-ey))%2==1)return ;
	for(int i = 0; i < 4; i++){
		int nx = x+dx[i], ny = y+dy[i];
		if(nx>=1&&nx<=n &&ny>=1&&ny<=m &&!vis[nx][ny]&&a[nx][ny]!='X'){
			vis[nx][ny] = 1;
			dfs(nx,ny,step+1);
			vis[nx][ny] = 0;
		}
	}
}

int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	while(cin>>n>>m>>T &&n&&m&&T){
		memset(vis,0,sizeof(vis));
		for(int i = 1; i <= n; i++){
			for(int j = 1; j <= m; j++){
				cin>>a[i][j];
				if(a[i][j]=='S'){sx=i;sy=j;}
				if(a[i][j]=='D'){ex=i;ey=j;}
			}
		}
		ok = 0;
		vis[sx][sy] = 1;
		dfs(sx,sy,0);
		if(ok)cout<<"YES\n";
		else cout<<"NO\n";
	}
	return 0;
}


已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页